摘要:利用Http加载网络图片。

解决思路:

1、直接用unity 自带的www加载,在高版本www已经过时了。

2、本文直接使用万能的文件流加载。

(1)使用System.Net.HttpWebRequest 请求网络流。

(2)利用System.Drawing这个dll把网络流装载到内存。可以获取远程网络图片的基本信息,图片宽高,格式等。如果已经知道远程图片数据,可以先把网络流拷贝到内存,直接对流进行操作。

(3)Texture2D.LoadImage显示图片

废话不多说,直接上代码

获取网络图片二进制数据:

 1 public struct RemoteImageMessage
2 {
3 public int Width;
4
5 public int Height;
6
7 public byte[] DataSource;
8 }
9
10 public static class ImageDownloadHelper
11 {
12 /// <summary>
13 /// 获取远程图片
14 /// </summary>
15 /// <param name="imgPath"></param>
16 /// <param name="complete"></param>
17 public static void GetImage(string imgPath, Action<RemoteImageMessage> complete)
18 {
19 System.Threading.Tasks.Task.Run(() =>
20 {
21 RemoteImageMessage remoteImageMessage = new RemoteImageMessage();
22 try
23 {
24 System.Net.HttpWebRequest webRequest = System.Net.WebRequest.CreateHttp(imgPath);
25 using (var response = webRequest.GetResponse())
26 {
27 if (response.ContentLength != 0)
28 {
29 System.IO.Stream stream = response.GetResponseStream();
30 System.Drawing.Image image = System.Drawing.Image.FromStream(stream);
31 remoteImageMessage.Width = image.Width;
32 remoteImageMessage.Height = image.Height;
33 var bytes = ImageToBytes(image);
34 remoteImageMessage.DataSource = bytes;
35 stream.Close();
36 stream.Dispose();
37 }
38 }
39 }
40 catch (Exception ex)
41 {
42 Debug.LogError("加载图片出错!" + ex);
43 }
44 finally
45 {
46 complete?.Invoke(remoteImageMessage);
47 }
48 });
49 }
50
51 /// <summary>
52 /// Image 转bytes
53 /// </summary>
54 /// <param name="image"></param>
55 /// <returns></returns>
56 private static byte[] ImageToBytes(System.Drawing.Image image)
57 {
58 System.Drawing.Imaging.ImageFormat format = image.RawFormat;
59 using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
60 {
61 if (format.Equals(System.Drawing.Imaging.ImageFormat.Jpeg))
62 {
63 image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
64 }
65 else if (format.Equals(System.Drawing.Imaging.ImageFormat.Png))
66 {
67 image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
68 }
69 else if (format.Equals(System.Drawing.Imaging.ImageFormat.Bmp))
70 {
71 image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
72 }
73 else if (format.Equals(System.Drawing.Imaging.ImageFormat.Gif))
74 {
75 image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
76 }
77 else if (format.Equals(System.Drawing.Imaging.ImageFormat.Icon))
78 {
79 image.Save(ms, System.Drawing.Imaging.ImageFormat.Icon);
80 }
81 byte[] buffer = new byte[ms.Length];
82 //Image.Save()会改变MemoryStream的Position,需要重新Seek到Begin
83 ms.Seek(0, System.IO.SeekOrigin.Begin);
84 ms.Read(buffer, 0, buffer.Length);
85 return buffer;
86 }
87 }
88
89 }

在unity中显示

 1 public class ImageLoaderHeler : MonoBehaviour
2 {
3 private RawImage rawImage = null;
4
5 private string[] imageUrl = new string[]
6 { "http://t8.baidu.com/it/u=2247852322,986532796&fm=79&app=86&f=JPEG?w=1280&h=853",
7 "http://t9.baidu.com/it/u=3363001160,1163944807&fm=79&app=86&f=JPEG?w=1280&h=830",
8 "http://t9.baidu.com/it/u=583874135,70653437&fm=79&app=86&f=JPEG?w=3607&h=2408",
9 "http://t9.baidu.com/it/u=2268908537,2815455140&fm=79&app=86&f=JPEG?w=1280&h=719",
10 "http://t7.baidu.com/it/u=1179872664,290201490&fm=79&app=86&f=JPEG?w=1280&h=854",
11 "http://t9.baidu.com/it/u=3923875871,1613462878&fm=79&app=86&f=JPEG?w=1280&h=854",
12 "http://t9.baidu.com/it/u=3949188917,63856583&fm=79&app=86&f=JPEG?w=1280&h=875",
13 "http://t7.baidu.com/it/u=1355385882,1155324943&fm=79&app=86&f=JPEG?w=1280&h=854",
14 "http://t8.baidu.com/it/u=2857883419,1187496708&fm=79&app=86&f=JPEG?w=1280&h=763",
15 "http://t7.baidu.com/it/u=830740827,3648735644&fm=79&app=86&f=JPEG?w=1280&h=853",
16 "http://t8.baidu.com/it/u=198337120,441348595&fm=79&app=86&f=JPEG?w=1280&h=732",
17 "http://t9.baidu.com/it/u=1577456063,1344044640&fm=79&app=86&f=JPEG?w=1280&h=853",
18 "http://t8.baidu.com/it/u=2678662753,1297312162&fm=79&app=86&f=JPEG?w=1181&h=787",
19 "http://t8.baidu.com/it/u=2148738019,2920001333&fm=79&app=86&f=JPEG?w=1181&h=788",
20 "http://t9.baidu.com/it/u=1373840141,993565751&fm=79&app=86&f=JPEG?w=1181&h=788"
21 };
22
23 // Start is called before the first frame update
24 void Start()
25 {
26 rawImage = GetComponent<RawImage>();
27 //InvokeRepeating("Test", 3, 0.5f);
28 }
29
30
31 private int index = 0;
32
33 private void Test()
34 {
35 if (index >= imageUrl.Length)
36 {
37 index = 0;
38 }
39 LoadImage(imageUrl[index++]);
40 }
41
42 private void LoadImage(string imagePath)
43 {
44 var start = DateTime.Now;
45 Debug.LogError("图片数据开始加载!");
46 ImageDownloadHelper.GetImage(imagePath, (image) =>
47 {
48 ThreadCrossor.GetInstance()?.AddTaskToMainThread(() =>
49 {
50 var ori = rawImage.texture;
51 if (ori != null)
52 {
53 DestroyImmediate(ori);
54 rawImage.texture = null;
55 }
56 Debug.LogError($"图片尺寸{image.Width},{image.Height}");
57 Texture2D texture2D = new Texture2D(image.Width, image.Height);
58 texture2D.LoadImage(image.DataSource);
59 rawImage.texture = texture2D;
60 });
61 Debug.LogError($"完成图片加载!加载时间:{(DateTime.Now - start).TotalSeconds}s");
62 });
63 }
64
65
66 // Update is called once per frame
67 void Update()
68 {
69
70 }
71 }

写了一个简单的跨线程交互的类

public class ThreadCrossor : MonoBehaviour
{
private static ThreadCrossor threadCrossor = null; List<Action> actions = new List<Action>(); public static ThreadCrossor GetInstance()
{
return threadCrossor;
} /// <summary>
/// 往主进程添加任务
/// </summary>
/// <param name="action"></param>
public void AddTaskToMainThread(Action action)
{
lock (actions)
{
actions.Add(action);
}
} // Start is called before the first frame update
void Start()
{
threadCrossor = this;
} // Update is called once per frame
void Update()
{
lock (actions)
{
if (actions.Count > 0)
{
foreach(var action in actions)
{
action?.Invoke();
}
actions.Clear();
}
}
}
}

效果如下:

unity 加载网络图片的更多相关文章

  1. 【WPF】wpf image控件加载网络图片不显示问题,

    1.加载网络图片到内存system.drawing.image对象中2.内存中的image 转Bitmap 再转适合system.windows.controls.image 的BitmapImage ...

  2. 有关DTCoreText无法加载网络图片及应用问题

    至于DTCoreText是干嘛的,不清楚的同学自行网上脑补,这就不啰嗦了,只说一下其用法. 里面有三种控件供大家使用,DTAttributedTextView, DTAttributedLabel 和 ...

  3. [转]全面理解Unity加载和内存管理

    [转]全面理解Unity加载和内存管理 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质 ...

  4. [原创]cocos2dx加载网络图片&异步加载图片

    [动机] 之前看到一款卡牌游戏,当你要看全屏高清卡牌的时候,游戏会单独从网络上下载,本地只存了非高清的,这样可以省点包大小,所以我萌生了实现一个读取网络图片的类. [联想] 之前浏览网页的时候经常看到 ...

  5. SDWebImage 加载网络图片失败,重新运行,就能加载成功。

    现象: 使用SDWebImage 加载网络图片,偶尔会有一两张图片就是显示不出来.重新运行有时又可以了. 这个问题的原因是: 当SDWebImage 在加载图片的时候 我用的是- (void)sd_s ...

  6. Android Volley入门到精通:使用Volley加载网络图片

    在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完 ...

  7. Android三种基本的加载网络图片方式(转)

    Android三种基本的加载网络图片方式,包括普通加载网络方式.用ImageLoader加载图片.用Volley加载图片. 1. [代码]普通加载网络方式 ? 1 2 3 4 5 6 7 8 9 10 ...

  8. 仿微信朋友圈图片查看-glide加载网络图片,photoview 实现缩放

    http://www.cnblogs.com/csonezp/p/5083286.html 这里实现的效果就和微信朋友圈点击图片后查看大图一样,如果你不清楚是什么效果,可以拿出手机,打开朋友圈,找到一 ...

  9. android官方开源的高性能异步加载网络图片的Gridview例子

    这个是我在安卓安卓巴士上看到的资料,放到这儿共享下.这个例子android官方提供的,其中讲解了如何异步加载网络图片,以及在gridview中高效率的显示图片此代码很好的解决了加载大量图片时,报OOM ...

随机推荐

  1. ANT中的copy和move标签

    Copy标签 该标签用于文件或文件集的拷贝,其属性如下: file 表示源文件. tofile 表示目标文件. todir 表示目标目录. overwrite 表示指定是否覆盖目标文件,默认值是不覆盖 ...

  2. 使用Docker安装ElasticSearch和可视化界面Kibana【图文教学】

    一.前言 Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java语言开发的,并 ...

  3. sublime中运行python时编码格式问题

      方案一在程序文件中以下三句 import sys reload(sys) sys.setdefaultencoding('utf8') 方案二在方案一不行的情况下,去除python的问题,subl ...

  4. 用Express 创建项目

    1.Node.js Express 框架安装:npm install express --save在当前目录下创建一个node_modules 2.安装必要的中间件npm install body-p ...

  5. java中最简单的计算执行时长的方式

    日常在做一些性能测试的时候会通过执行时间来判断执行时长,java中最简单的方式如下: //开始时间 long startL= new Date().getTime(); //这里需要导入 java.u ...

  6. Spring5源码解析系列一——IoC容器核心类图

    基本概念梳理 IoC(Inversion of Control,控制反转)就是把原来代码里需要实现的对象创建.依赖,反转给容器来帮忙实现.我们需要创建一个容器,同时需要一种描述来让容器知道要创建的对象 ...

  7. 基于UDP传输协议局域网文件接收软件设计 Java版

    网路传输主要的两大协议为TCP/IP协议和UDP协议,本文主要介绍基于UDP传输的一个小软件分享,针对于Java网络初学者是一个很好的练笔,大家可以参考进行相关的联系,但愿能够帮助到大家. 话不多说, ...

  8. Solution Set -「LOCAL」冲刺省选 Round XXIV

    \(\mathscr{Summary}\)   名副其实的 trash round,希望以后没有了.   A 题算好,确实一个比较关键的简化状态的点没想到,所以只拿了暴力(不考虑 \(\mathcal ...

  9. v79.01 鸿蒙内核源码分析(用户态锁篇) | 如何使用快锁Futex(上) | 百篇博客分析OpenHarmony源码

    百篇博客分析|本篇为:(用户态锁篇) | 如何使用快锁Futex(上) 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) ...

  10. Spring常用配置使用示例

    上篇介绍了Spring配置的基本情况,本篇介绍Spring常用配置具体如何使用.关于基础的配置,比如Configuration之类的就不示例,主要示例相对用的比较多同时可能比较复杂的标签或属性. 1) ...