当前位置:   article > 正文

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

unity 显示图片

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

 

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

   

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

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

  1. /// <summary>
  2.     /// 将Texture2d转换为Sprite
  3.     /// </summary>
  4.     /// <param name="tex">参数是texture2d纹理</param>
  5.     /// <returns></returns>
  6.     private Sprite TextureToSprite(Texture2D tex)
  7.     {
  8.         Sprite sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
  9.         return sprite;
  10.     }

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

此效果源码:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using System.IO;
  5. using System;
  6. using UnityEngine.UI;
  7. public class TestOpenFile : MonoBehaviour {
  8.     private Button btn;//部落按钮
  9.     private Button nextBtn;//下一张按钮
  10.     private Image image;//用来显示图片
  11.     private Sprite sprite;//粗放sprite类型的图片
  12.     private List<Sprite> spriteList = new List<Sprite>();//存放sprite的list(存放很多张)
  13.     private string[] files;//存放指定路径下的所有图片的路径
  14.     private int index = 0;
  15.     private void Awake()
  16.     {
  17.         btn = GameObject.Find("btn").GetComponent<Button>();
  18.         nextBtn = GameObject.Find("Next").GetComponent<Button>();
  19.         image = GameObject.Find("Image").GetComponent<Image>();
  20.         btn.onClick.AddListener(BtnOnClicked);
  21.         nextBtn.onClick.AddListener(NextOnClicked);
  22.         GetSpriteList();
  23.     }
  24.     /// <summary>
  25.     /// 显示部落图片的按钮点击事件
  26.     /// </summary>
  27.     private void BtnOnClicked()
  28.     {
  29.         sprite = TextureToSprite(LoadTextureByIO());
  30.         image.sprite = sprite;
  31.     }
  32.     /// <summary>
  33.     /// 切图按钮点击事件
  34.     /// </summary>
  35.     private void NextOnClicked()
  36.     {
  37.         if (index >= files.Length)
  38.         {
  39.             index = 0;
  40.         }
  41.         image.sprite = spriteList[index];
  42.         index++;
  43.     }
  44.     /// <summary>
  45.     /// 获取指定路径下的所有图片(sprite类型
  46.     /// </summary>
  47.     private void GetSpriteList()
  48.     {
  49.         files = Directory.GetFiles(@"D:\zzw\My\Picture\壁纸");
  50.         foreach (var item in files)
  51.         {
  52.             Debug.Log(item);
  53.         }
  54.         for (int i = 0; i < files.Length; i++)
  55.         {
  56.             spriteList.Add(TextureToSprite(LoadTextureByIO(files[i])));
  57.         }
  58.     }
  59.     /// <summary>
  60.     /// 从外部指定文件中加载图片
  61.     /// </summary>
  62.     /// <param name="path">文件路径</param>
  63.     /// <returns></returns>
  64.     private Texture2D LoadTextureByIO(string path)
  65.     {
  66.         FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
  67.         fs.Seek(0, SeekOrigin.Begin);//游标的操作,可有可无
  68.         byte[] bytes = new byte[fs.Length];//生命字节,用来存储读取到的图片字节
  69.         try
  70.         {
  71.             fs.Read(bytes, 0, bytes.Length);//开始读取,这里最好用trycatch语句,防止读取失败报错
  72.         }
  73.         catch (Exception e)
  74.         {
  75.             Debug.Log(e);
  76.         }
  77.         fs.Close();//切记关闭
  78.         int width = 2048;//图片的宽(这里两个参数可以提到方法参数中)
  79.         int height = 2048;//图片的高(这里说个题外话,pico相关的开发,这里不能大于4k×4k不然会显示异常,当时开发pico的时候应为这个问题找了大半天原因,因为美术给的图是6000*3600,导致出现切几张图后就黑屏了。。。
  80.         Texture2D texture = new Texture2D(width, height);
  81.         if (texture.LoadImage(bytes))
  82.         {
  83.             print("图片加载完毕 ");
  84.             return texture;//将生成的texture2d返回,到这里就得到了外部的图片,可以使用了
  85.         }
  86.         else
  87.         {
  88.             print("图片尚未加载");
  89.             return null;
  90.         }
  91.     }
  92.     /// <summary>
  93.     /// 这个同上,区别在于无参,写死路径
  94.     /// </summary>
  95.     /// <returns></returns>
  96.     private Texture2D LoadTextureByIO()
  97.     {
  98.         FileStream fs = new FileStream(@"D:\zzw\My\Picture\壁纸\部落.jpg", FileMode.Open, FileAccess.Read);
  99.         fs.Seek(0, SeekOrigin.Begin);//游标的操作,可有可无
  100.         byte[] bytes = new byte[fs.Length];//生命字节,用来存储读取到的图片字节
  101.         try
  102.         {
  103.             fs.Read(bytes, 0, bytes.Length);//开始读取,这里最好用trycatch语句,防止读取失败报错
  104.         }
  105.         catch (Exception e)
  106.         {
  107.             Debug.Log(e);
  108.         }
  109.         fs.Close();//切记关闭
  110.         int width = 2048;//图片的宽(这里两个参数可以提到方法参数中)
  111.         int height = 2048;//图片的高(这里说个题外话,pico相关的开发,这里不能大于4k×4k不然会显示异常,当时开发pico的时候应为这个问题找了大半天原因,因为美术给的图是6000*3600,导致出现切几张图后就黑屏了。。。
  112.         Texture2D texture = new Texture2D(width, height);
  113.         if (texture.LoadImage(bytes))
  114.         {
  115.             print("图片加载完毕 ");
  116.             return texture;//将生成的texture2d返回,到这里就得到了外部的图片,可以使用了
  117.         }
  118.         else
  119.         {
  120.             print("图片尚未加载");
  121.             return null;
  122.         }
  123.     }
  124.     /// <summary>
  125.     /// 将Texture2d转换为Sprite
  126.     /// </summary>
  127.     /// <param name="tex">参数是texture2d纹理</param>
  128.     /// <returns></returns>
  129.     private Sprite TextureToSprite(Texture2D tex)
  130.     {
  131.         Sprite sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
  132.         return sprite;
  133.     }
  134. }
  135. ---------------------------------分割线-----------------------------------
  136. 以下为补充代码,需要替换,不能全部复制。加入上一张按钮功能,且运行后默认显示文件夹中的第一张图片
  137. 第一个方法为新增函数(自己声明并绑定下点击事件)
  138. 后两个方法直接吧上边的替换掉
  139. /// <summary>
  140. /// 上一张按钮点击事件
  141. /// </summary>
  142. private void PreviousOnClicked()
  143. {
  144. index--;
  145. if (index < 0)
  146. {
  147. index = files.Length - 1;
  148. }
  149. image.sprite = spriteList[index];
  150. }
  151. /// <summary>
  152. /// 下一张按钮点击事件
  153. /// </summary>
  154. private void NextOnClicked()
  155. {
  156. index++;
  157. if (index >= files.Length)
  158. {
  159. index = 0;
  160. }
  161. image.sprite = spriteList[index];
  162. }
  163. /// <summary>
  164. /// 获取指定路径下的所有图片(sprite类型
  165. /// </summary>
  166. private void GetSpriteList()
  167. {
  168. files = Directory.GetFiles(@"D:\zzw\My\Picture\壁纸");
  169. foreach (var item in files)
  170. {
  171. Debug.Log(item);
  172. }
  173. for (int i = 0; i < files.Length; i++)
  174. {
  175. spriteList.Add(TextureToSprite(LoadTextureByIO(files[i])));
  176. }
  177. image.sprite = spriteList[index];
  178. }



 

未完待续。。。

2020-7-28

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

  1. public RawImage raw;//记得外部赋值下
  2. private void Start()
  3. {
  4. StartCoroutine(LoadTexture(filePathTexture));//再Start中调用即可
  5. }
  6. /// <summary>
  7. /// 协程加载外部图片
  8. /// </summary>
  9. /// <param name="path">图片的路径</param>
  10. /// <returns></returns>
  11. IEnumerator LoadTexture(string path)
  12. {
  13. //WWW已经被弃用,如果要加载Texture则需要用到下边的方法
  14. UnityWebRequest www = UnityWebRequestTexture.GetTexture(path);
  15. yield return www.SendWebRequest();
  16. //image.texture = texd1;
  17. if (www != null && !m_Request.isError)//这一步代表图片读取完毕
  18. {
  19. raw.texture = DownloadHandlerTexture.GetContent(www);
  20. raw.SetNativeSize();//将读取到的Texture设置为原大小
  21. }
  22. }
  23. /// <summary>
  24. /// 协程加载外部图片
  25. /// 方法功能和上边一模一样,但使用了using关键字
  26. /// using 语句定义一个范围,在此范围的末尾将释放对象。提供可确保正确使用 IDisposable 对象的方便语法。注意使用前提:该对象必须继承了IDisposable接口,功能等同于try{}Finally{ }。
  27. /// 建议使用此方法而不是上边那个
  28. /// </summary>
  29. /// <param name="path">图片的路径</param>
  30. /// <returns></returns>
  31. IEnumerator LoadTexture(string path)
  32. {
  33. using (UnityWebRequest m_Request = UnityWebRequestTexture.GetTexture(path))
  34. {
  35. yield return m_Request.SendWebRequest();
  36. if (m_Request == null || m_Request.isError)
  37. {
  38. Debug.Log("加载失败");
  39. }
  40. else
  41. {
  42. raw.texture = DownloadHandlerTexture.GetContent(m_Request);
  43. raw.SetNativeSize();//将读取到的Texture设置为原大小
  44. }
  45. }
  46. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/106602
推荐阅读
相关标签
  

闽ICP备14008679号