栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

Unity读取图片并显示到UI中

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity读取图片并显示到UI中

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);
        });
    }

    /// 
    /// 将图片转化为字符串
    /// 
    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);
    }

    /// 
    /// 将字符串转换为纹理
    /// 
    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);
            });
    }

    /// 
    /// 将图片转换为字节数组
    /// 
    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;
    }

    /// 
    /// 将字节数组转换为纹理    
    /// 
    public Texture2D GetTextureByByte(byte[] imgByte)
    {
        Texture2D tex = new Texture2D(100, 100);
        tex.LoadImage(imgByte);
        return tex;
    }
}
解释

这里为了测试方便,将图片放在了Assets->StreamingAssets目录下,图片名为king.jpg,如下图;

创建一个空物体,命名为LoadImageByByte ,将脚本挂在空物体上,并将UI组件挂到脚本上,如下图。

效果图

对比

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/901647.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号