Unity3d中(加载(内部、外部))显示图片(sprite、texture2d) 您所在的位置:网站首页 img/sprite/SmartTV.png Unity3d中(加载(内部、外部))显示图片(sprite、texture2d)

Unity3d中(加载(内部、外部))显示图片(sprite、texture2d)

2023-08-10 06:02| 来源: 网络整理| 查看: 265

介绍:在这片中将逐渐添加开发中遇到的各种加载图片的方法、情况

一、使用文件流(FileStream)从指定文件夹中读取图片

   

///     /// 从外部指定文件中加载图片     ///     ///     private Texture2D LoadTextureByIO()     {         FileStream fs = new FileStream(@"D:\" + "图片文件名的全程(包含后缀名)比如  1.png", FileMode.Open, FileAccess.Read);         fs.Seek(0, SeekOrigin.Begin);//游标的操作,可有可无         byte[] bytes = new byte[fs.Length];//生命字节,用来存储读取到的图片字节         try         {             fs.Read(bytes, 0, bytes.Length);//开始读取,这里最好用trycatch语句,防止读取失败报错         }         catch (Exception e)         {             Debug.Log(e);         }         fs.Close();//切记关闭         int width = 2048;//图片的宽(这里两个参数可以提到方法参数中)         int height = 2048;//图片的高(这里说个题外话,pico相关的开发,这里不能大于4k×4k不然会显示异常,当时开发pico的时候应为这个问题找了大半天原因,因为美术给的图是6000*3600,导致出现切几张图后就黑屏了。。。         Texture2D texture = new Texture2D(width, height);         if (texture.LoadImage(bytes))         {             print("图片加载完毕 ");             return texture;//将生成的texture2d返回,到这里就得到了外部的图片,可以使用了         }         else         {             print("图片尚未加载");             return null;         }     }

经过上边的方法获取到了外部的图片,得到的是Texture2d,如果目的是需要sprite,则调用下边的方法即可

///     /// 将Texture2d转换为Sprite     ///     /// 参数是texture2d纹理     ///     private Sprite TextureToSprite(Texture2D tex)     {         Sprite sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));         return sprite;     }

还可以将所需的外部图片存放到一个List集合中,实现预览效果

此效果源码:

using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using System; using UnityEngine.UI; public class TestOpenFile : MonoBehaviour {     private Button btn;//部落按钮     private Button nextBtn;//下一张按钮     private Image image;//用来显示图片     private Sprite sprite;//粗放sprite类型的图片     private List spriteList = new List();//存放sprite的list(存放很多张)     private string[] files;//存放指定路径下的所有图片的路径     private int index = 0;     private void Awake()     {         btn = GameObject.Find("btn").GetComponent();         nextBtn = GameObject.Find("Next").GetComponent();         image = GameObject.Find("Image").GetComponent();         btn.onClick.AddListener(BtnOnClicked);         nextBtn.onClick.AddListener(NextOnClicked);         GetSpriteList();     }     ///     /// 显示部落图片的按钮点击事件     ///     private void BtnOnClicked()     {         sprite = TextureToSprite(LoadTextureByIO());         image.sprite = sprite;     }     ///     /// 切图按钮点击事件     ///     private void NextOnClicked()     {         if (index >= files.Length)         {             index = 0;         }         image.sprite = spriteList[index];         index++;     }     ///     /// 获取指定路径下的所有图片(sprite类型     ///     private void GetSpriteList()     {         files = Directory.GetFiles(@"D:\zzw\My\Picture\壁纸");         foreach (var item in files)         {             Debug.Log(item);         }         for (int i = 0; i < files.Length; i++)         {             spriteList.Add(TextureToSprite(LoadTextureByIO(files[i])));         }     }     ///     /// 从外部指定文件中加载图片     ///     /// 文件路径     ///     private Texture2D LoadTextureByIO(string path)     {         FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);         fs.Seek(0, SeekOrigin.Begin);//游标的操作,可有可无         byte[] bytes = new byte[fs.Length];//生命字节,用来存储读取到的图片字节         try         {             fs.Read(bytes, 0, bytes.Length);//开始读取,这里最好用trycatch语句,防止读取失败报错         }         catch (Exception e)         {             Debug.Log(e);         }         fs.Close();//切记关闭         int width = 2048;//图片的宽(这里两个参数可以提到方法参数中)         int height = 2048;//图片的高(这里说个题外话,pico相关的开发,这里不能大于4k×4k不然会显示异常,当时开发pico的时候应为这个问题找了大半天原因,因为美术给的图是6000*3600,导致出现切几张图后就黑屏了。。。         Texture2D texture = new Texture2D(width, height);         if (texture.LoadImage(bytes))         {             print("图片加载完毕 ");             return texture;//将生成的texture2d返回,到这里就得到了外部的图片,可以使用了         }         else         {             print("图片尚未加载");             return null;         }     }     ///     /// 这个同上,区别在于无参,写死路径     ///     ///     private Texture2D LoadTextureByIO()     {         FileStream fs = new FileStream(@"D:\zzw\My\Picture\壁纸\部落.jpg", FileMode.Open, FileAccess.Read);         fs.Seek(0, SeekOrigin.Begin);//游标的操作,可有可无         byte[] bytes = new byte[fs.Length];//生命字节,用来存储读取到的图片字节         try         {             fs.Read(bytes, 0, bytes.Length);//开始读取,这里最好用trycatch语句,防止读取失败报错         }         catch (Exception e)         {             Debug.Log(e);         }         fs.Close();//切记关闭         int width = 2048;//图片的宽(这里两个参数可以提到方法参数中)         int height = 2048;//图片的高(这里说个题外话,pico相关的开发,这里不能大于4k×4k不然会显示异常,当时开发pico的时候应为这个问题找了大半天原因,因为美术给的图是6000*3600,导致出现切几张图后就黑屏了。。。         Texture2D texture = new Texture2D(width, height);         if (texture.LoadImage(bytes))         {             print("图片加载完毕 ");             return texture;//将生成的texture2d返回,到这里就得到了外部的图片,可以使用了         }         else         {             print("图片尚未加载");             return null;         }     }     ///     /// 将Texture2d转换为Sprite     ///     /// 参数是texture2d纹理     ///     private Sprite TextureToSprite(Texture2D tex)     {         Sprite sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));         return sprite;     } }

 

未完待续。。。

2020-7-28

二、使用协程来加载外部图片。

public RawImage raw;//记得外部赋值下 private void Start() { StartCoroutine(LoadTexture(filePathTexture));//再Start中调用即可 } /// /// 协程加载外部图片 /// /// 图片的路径 /// IEnumerator LoadTexture(string path) { //WWW已经被弃用,如果要加载Texture则需要用到下边的方法 UnityWebRequest www = UnityWebRequestTexture.GetTexture(path); yield return www.SendWebRequest(); //image.texture = texd1; if (www != null && !m_Request.isError)//这一步代表图片读取完毕 { raw.texture = DownloadHandlerTexture.GetContent(www); raw.SetNativeSize();//将读取到的Texture设置为原大小 } } /// /// 协程加载外部图片 /// 方法功能和上边一模一样,但使用了using关键字 /// using 语句定义一个范围,在此范围的末尾将释放对象。提供可确保正确使用 IDisposable 对象的方便语法。注意使用前提:该对象必须继承了IDisposable接口,功能等同于try{}Finally{ }。 /// 建议使用此方法而不是上边那个 /// /// 图片的路径 /// IEnumerator LoadTexture(string path) { using (UnityWebRequest m_Request = UnityWebRequestTexture.GetTexture(path)) { yield return m_Request.SendWebRequest(); if (m_Request == null || m_Request.isError) { Debug.Log("加载失败"); } else { raw.texture = DownloadHandlerTexture.GetContent(m_Request); raw.SetNativeSize();//将读取到的Texture设置为原大小 } } }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有