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

3

我在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文件夹中后,构建“System.Drawing.Image”时仍会出现错误,提示找不到“gdiplus.dll”。我尝试下载并添加了所需的“gdiplus.dll”到Assets中,但我收到的错误消息是无法找到它!
我不理解为什么很难让System.Drawing函数在Unity中正常工作,但这有点离题,因为我真正想做的只是创建一个位于用户Android设备上的图像缩略图。欢迎提供任何建议!
编辑:我忘记提到我想避免使用Texture2D的解决方案,因为它们无法在主线程之外运行,从而导致性能下降。
谢谢您的帮助!=)
1个回答

3
不要使用Texture2D.Resize,因为结果纹理将变成灰色:
在调整大小后,纹理像素将未定义。
查看此帖子以获取其他解决方案。
旧答案
我建议使用开源的C#图像处理库,例如ImageSharp在GitHub上搜索
最后一种解决方案是自己编写一个,如果第三方库的性能或大小仍然不够好。
以下是我可以想到的两个想法:
1.将可能很长的读取和调整大小过程分成几个{{link4:Coroutines}}。
2.使用多线程
你也可以尝试从Unity3D调用Java函数。但我对此不太熟悉。

2
最终,我成功使一个Java插件工作,其中我在一个单独的线程上调用了一个函数,该函数利用了Android的"android.media.ThumbnailUtils"库。由于它在单独的线程上运行,因此也不会导致任何帧速率问题!我接受你的答案,因为它指导我使用Java来解决这个问题! - Arthur
很高兴知道它有所帮助! - zwcloud
请在提供答案时,如果不确定,请尝试一下。仅在评论中说“可以尝试这个或那个”是不够的。调整大小不会创建纹理的较小版本,它只会调整大小并留下未定义的纹理。 - Everts
@Everts 很抱歉误导了您。回答已更新。 - zwcloud
1
实际上,有一些解决方案不需要像这个库那样完整,比如这个:http://blog.collectivemass.com/2014/03/resizing-textures-in-unity/。我已经测试并且可以正常工作。由于它使用Texture2D类,所以很可能是平台无关的。 - Everts
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接