在unity中,存储UGUI的图片存储到磁盘以及读取磁盘图片信息显示在UGUI上。
一.存储UGUI的图片存储到磁盘;
1.把UGUI上的Sprite信息转换成byte数组,此时需要打开sprite图片的读写功能;
具体代码写法
public Image BG; //UGUI上的Image图片 string FilePath=Application.streamingAssetsPath;//可为磁盘任意位置 public InputField inputMapID; //存储后图片的名字 public void Save() { if(inputMapID.text!="") { byte[] bgBytes = GetByte(BG.sprite); SaveToFile(inputMapID.text, bgBytes); } } //从Image转byte数组 public byte[] GetByte(Sprite sp) { //转换成Texture2d Texture2D temp = DeCompress(sp.texture) ; //在转换成bytes byte[] photoByte = temp.EncodeToJPG(); return photoByte; } //需要压缩成Texture2d,此处不可直接压缩 public Texture2D DeCompress(Texture2D source) { RenderTexture renderTex = RenderTexture.GetTemporary( source.width, source.height, 0, RenderTextureFormat.Default, RenderTextureReadWrite.Linear); Graphics.Blit(source, renderTex); RenderTexture previous = RenderTexture.active; RenderTexture.active = renderTex; Texture2D readableText = new Texture2D(source.width, source.height); readableText.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0); readableText.Apply(); RenderTexture.active = previous; RenderTexture.ReleaseTemporary(renderTex); return readableText; } //将转化后的byte数组存储到磁盘 public void SaveToFile(string MapID, byte[] data) { string outFile = FilePath + "/" + MapID+".jpg"; FileStream fs = new FileStream(outFile, FileMode.Create, FileAccess.Write); fs.Write(data, 0, data.Length); fs.Flush(); fs.Close(); fs.Dispose(); AssetDatabase.Refresh(); //刷新Asset目录显示 }
2.将jpg文件读取并显示到UGUI上
//获取指定路径下的文件“.jpg”格式 void GetJPGFiles() { if (Directory.Exists(FilePath)) { DirectoryInfo direction = new DirectoryInfo(FilePath); FileInfo[] files = direction.GetFiles("*.jpg"); for (int i = 0; i < files.Length; i++) { //忽略关联文件 if (files[i].Name.EndsWith(".meta")) { continue; } Image img= Maps.content.GetChild(i).GetComponent<Image>(); img.sprite = GetSprite(FilePath+"/"+files[i].Name); Text txt = img.GetComponentInChildren<Text>(); txt.text = files[i].Name.Replace(".jpg", ""); } } } //将文件读取转化为byte数组格式 public Sprite GetSprite(string imgFile) { byte[] imgbyte = File.ReadAllBytes(imgFile); Sprite sp = GetSprite(imgbyte); return sp; } //将byte数组转为sprite public Sprite GetSprite(Byte[] bytes) { //先创建一个Texture2D对象,用于把流数据转成Texture2D Texture2D texture = new Texture2D(10, 10); texture.LoadImage(bytes);//流数据转换成Texture2D //创建一个Sprite,以Texture2D对象为基础 Sprite sp = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero); return sp; }
当时做的功能是把InputFile输入的文本作为名字,把BG的图片存储和读取,整体代码如下:
using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine; using UnityEngine.UI; public class SaveID : MonoBehaviour { public Dictionary<string, byte[]> Map = new Dictionary<string, byte[]>(); public Button SaveBtn; public Image BG; public InputField inputMapID; public ScrollRect Maps; string FilePath=Application.streamingAssetsPath; private void Awake() { if (!Directory.Exists(FilePath)) { Directory.CreateDirectory(FilePath); } GetJPGFiles(); } // Start is called before the first frame update void Start() { SaveBtn.onClick.AddListener(() => { Save(); }); } public void Save() { if(inputMapID.text!="") { byte[] bgBytes = GetByte(BG.sprite); SaveToFile(inputMapID.text, bgBytes); } } public Texture2D DeCompress(Texture2D source) { RenderTexture renderTex = RenderTexture.GetTemporary( source.width, source.height, 0, RenderTextureFormat.Default, RenderTextureReadWrite.Linear); Graphics.Blit(source, renderTex); RenderTexture previous = RenderTexture.active; RenderTexture.active = renderTex; Texture2D readableText = new Texture2D(source.width, source.height); readableText.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0); readableText.Apply(); RenderTexture.active = previous; RenderTexture.ReleaseTemporary(renderTex); return readableText; } public byte[] GetByte(Sprite sp) { //转换成Texture Texture2D temp = DeCompress(sp.texture) ; //在转换成bytes byte[] photoByte = temp.EncodeToJPG(); return photoByte; } public Sprite GetSprite(Byte[] bytes) { //先创建一个Texture2D对象,用于把流数据转成Texture2D Texture2D texture = new Texture2D(10, 10); texture.LoadImage(bytes);//流数据转换成Texture2D //创建一个Sprite,以Texture2D对象为基础 Sprite sp = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero); return sp; } public Sprite GetSprite(string imgFile) { byte[] imgbyte = File.ReadAllBytes(imgFile); Sprite sp = GetSprite(imgbyte); return sp; } public void SaveToFile(string MapID, byte[] data) { string outFile = FilePath + "/" + MapID+".jpg"; FileStream fs = new FileStream(outFile, FileMode.Create, FileAccess.Write); fs.Write(data, 0, data.Length); fs.Flush(); fs.Close(); fs.Dispose(); AssetDatabase.Refresh(); } void GetJPGFiles() { if (Directory.Exists(FilePath)) { DirectoryInfo direction = new DirectoryInfo(FilePath); FileInfo[] files = direction.GetFiles("*.jpg"); for (int i = 0; i < files.Length; i++) { //忽略关联文件 if (files[i].Name.EndsWith(".meta")) { continue; } Image img= Maps.content.GetChild(i).GetComponent<Image>(); img.sprite = GetSprite(FilePath+"/"+files[i].Name); Text txt = img.GetComponentInChildren<Text>(); txt.text = files[i].Name.Replace(".jpg", ""); } } } }