Unity读取图片并显示到UI中
在进行Unity开发时,经常会遇到将读取磁盘中图片显示到UI上,或者将图片进行网络传输的问题,以下是两种解决问题的方法。
方法一:将图片转换成字符串
读取存放在磁盘中的图片,然后将图片转换成字节数组,再将字节数组转换成字符串,此时可以将转换后的字符串作为传输介质,比如进行网络传输,可以传输该字符串;在使用时,将字符串转换为字节数组,再将字节数组转换为Texture,最后在UI上显示。
代码
using System;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
public class LoadImageByString : MonoBehaviour
{
public RawImage showImage;
public Button loadImage;
private string imgPath;
private string imageStr;
private void Awake()
{
imgPath = Application.streamingAssetsPath + "/king.jpg";
imageStr = SetImageToString(imgPath);
}
void Start()
{
loadImage.onClick.AddListener(() =>
{
showImage.texture = GetTextureByString(imageStr);
});
}
/// <summary>
/// 将图片转化为字符串
/// </summary>
private string SetImageToString(string imgPath)
{
FileStream fs = new FileStream(imgPath, FileMode.Open);
byte[] imgByte = new byte[fs.Length];
fs.Read(imgByte, 0, imgByte.Length);
fs.Close();
return Convert.ToBase64String(imgByte);
}
/// <summary>
/// 将字符串转换为纹理
/// </summary>
private Texture2D GetTextureByString(string textureStr)
{
Texture2D tex = new Texture2D(1, 1);
byte[] arr = Convert.FromBase64String(textureStr);
tex.LoadImage(arr);
tex.Apply();
return tex;
}
}
解释
这里为了测试方便,将图片放在了Assets->StreamingAssets目录下,图片名为king.jpg,如下图;
创建一个空物体,命名为LoadImageByString ,将脚本挂在空物体上,并将UI组件挂到脚本上,如下图。
效果图
点击加载按钮,图片加载到了UI上。
方法二:将图片转换成字节数组
读取存放在磁盘中的图片,然后将图片转换成字节数组,此时可以将转换后的字节数组作为传输介质,比如进行网络传输,可以传输该字节数组;在使用时,字节数组转换为Texture,然后在UI上显示。
代码
using System.IO;
using UnityEngine;
using UnityEngine.UI;
public class LoadImageByByte : MonoBehaviour
{
public RawImage showImage;
public Button loadBt;
private string imgPath;
private byte[] imageByte;
private void Awake()
{
imgPath = Application.streamingAssetsPath + "/king.jpg";
imageByte = SetImageToByte(imgPath);
}
void Start()
{
loadBt.onClick.AddListener(() =>
{
showImage.texture = GetTextureByByte(imageByte);
});
}
/// <summary>
/// 将图片转换为字节数组
/// </summary>
public byte[] SetImageToByte(string imgPath)
{
FileStream fs = new FileStream(imgPath, FileMode.Open);
byte[] imgByte = new byte[fs.Length];
fs.Read(imgByte, 0, imgByte.Length);
fs.Close();
return imgByte;
}
/// <summary>
/// 将字节数组转换为纹理
/// </summary>
public Texture2D GetTextureByByte(byte[] imgByte)
{
Texture2D tex = new Texture2D(100, 100);
tex.LoadImage(imgByte);
return tex;
}
}
解释
这里为了测试方便,将图片放在了Assets->StreamingAssets目录下,图片名为king.jpg,如下图;
创建一个空物体,命名为LoadImageByByte ,将脚本挂在空物体上,并将UI组件挂到脚本上,如下图。
效果图
对比
方法一和方法二的基本原理都是一样的,都是通过转换字节数组的方式,只是方法一多了转换字符串的中间步骤,方法二的速度稍快。
如有问题,欢迎交流指正。