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组件挂到脚本上,如下图。
在这里插入图片描述

效果图

在这里插入图片描述

对比

方法一和方法二的基本原理都是一样的,都是通过转换字节数组的方式,只是方法一多了转换字符串的中间步骤,方法二的速度稍快。
如有问题,欢迎交流指正。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值