如何通过 C# 代码在 Android 上的 Unity3D 中创建图像缩略图?

Posted

技术标签:

【中文标题】如何通过 C# 代码在 Android 上的 Unity3D 中创建图像缩略图?【英文标题】:How to create an Image Thumbnail in Unity3D on Android through C# code? 【发布时间】:2017-08-16 13:56:14 【问题描述】:

我在 Unity 中有一些 C# 代码,可以从我的 android 设备的文件系统中抓取一张大图像,现在我想用它来创建一个小缩略图。

我发现了很多关于如何做到这一点的不同建议,例如:

MemoryStream outputStream = new MemoryStream();
System.Drawing.Image image = System.Drawing.Image.FromFile(originalImagePath);
System.Drawing.Image thumbnail = image.GetThumbnailImage(thumbnailWidth, thumbnailHeight,()=>false, IntPtr.Zero);
thumbnail.Save(outputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
return outputStream;

但是,与上述方法一样,我发现的所有方法都要求您使用 System.Drawing 命名空间。而且我这辈子都无法让这个命名空间中的函数在 Android 上运行,因为即使在将“System.Drawing.dll”添加到 Assets 文件夹之后,我也会收到一条错误消息,说它无法找到“gdiplus” .dll”关于“System.Drawing.Image”的构造。我尝试下载并添加所说的“gdiplus.dll”到资产,但我只是得到了同样的错误,好像它找不到它一样!

我不明白为什么要让 System.Drawing 函数在 Unity 中工作如此困难,但这不是重点,因为我真正想做的就是创建一个存在于用户 Android 上的图像的缩略图设备。欢迎提出任何建议!

编辑:我忘了提到我想避免使用 Texture2D 的解决方案,因为它们不能在主线程之外运行,因此会带来性能后果 =(

提前致谢! =)

【问题讨论】:

【参考方案1】:

不要使用Texture2D.Resize,因为生成的纹理会变成灰色:

调整大小后,纹理像素将未定义。

请参阅this post 了解其他解决方案。

旧答案

我建议使用开源 C# 图像处理库,例如 ImageSharp 或 search it on GitHub。

如果第三方库的性能或大小仍然不够好,最后一个解决方案是自己编写。

以下是我能想到的两个想法:

    将可能冗长的读取和调整大小过程拆分为几个Coroutines。 使用多线程

您也可以试试calling java functions from Unity3D。但我对此并不熟悉。

【讨论】:

嗨@zwcloud,感谢您的回复!所以我想我没有告诉你完整的故事,但使用 Texture2D 对我来说是个问题,因为我的图像非常大,因此在运行时创建它们会影响性能......我有一个使用 aa C+ 的方法+插件删除此成本并通过 CreateExternalTexture() 返回 Texture2D - 不幸的是,在通过此方法创建的 Texture2D 上调用 Resize() 似乎不起作用 =/ 最后我设法让一个 Java 插件工作,我在一个单独的线程上调用了一个函数,该线程使用了 android 的“android.media.ThumbnailUtils”库。因为它在一个单独的线程上,所以它也不会导致任何帧速率打嗝!我接受您的回答,因为它指出我使用 Java 来解决问题! 很高兴知道它有帮助! 我已经对此表示赞同,但意识到 tex.Resize() 只会更改大小,并且所有像素都设置为 gray=undefined。查看文档:docs.unity3d.com/ScriptReference/Texture2D.Resize.html 实际上,有些解决方案不需要像这样的完整库:blog.collectivemass.com/2014/03/resizing-textures-in-unity 经过测试并为我工作。最有可能独立于平台,因为它使用 Texture2D 类。

以上是关于如何通过 C# 代码在 Android 上的 Unity3D 中创建图像缩略图?的主要内容,如果未能解决你的问题,请参考以下文章

unity3d 怎样发布android程序

如何在 ASCX 页面上的 ASP 网站上从 C# 代码执行 url 调用?

如何通过android上的ADB命令通过pc拨打电话?

如何通过滑行在 Google 地图上的 infoWindow 中获取图像 - Android

如何在 C# 桌面应用程序和移动(android)设备之间通过本地网络进行通信? [关闭]

无法连接到 android 5.1 上的本机本地套接字