在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", "");
            }
        }
    }

    
}

 

posted on 2020-11-04 16:39  墨妖  阅读(561)  评论(0编辑  收藏  举报