Image.FromFile() 或 FromStream() 在 GdiplusStartup 上挂起

Posted

技术标签:

【中文标题】Image.FromFile() 或 FromStream() 在 GdiplusStartup 上挂起【英文标题】:Image.FromFile() or FromStream() hangs on GdiplusStartup 【发布时间】:2015-01-09 17:30:09 【问题描述】:

我有一个包含这一行的简单 C# 应用程序:

var mImage = System.Drawing.Image.FromFile(filename);

在 Windows (.NET) 上运行此代码时,图像已正确加载。 在 OS X (Mono) 上运行相同的代码时,应用程序只是挂起。调试器永远留在那个调用中。无一例外。

调用堆栈显示应用程序挂起:

System.Drawing.GDIPlus.GdiplusStartup()

这里可能出了什么问题?

PS:我安装了最新版本的 Xamarin Studio 和 Mono。

【问题讨论】:

这是标准的.NET Image 只是这一个图像文件导致了问题,还是无论您尝试打开哪个文件,您都会遇到相同的挂起?当您在 Windows 上加载图像时,图像是否按预期加载(即看起来正确,没有伪影)? 在问这个问题之前猜猜我做了什么。我在那里找不到解决问题的方法。 此时该搜索的最高结果是this other question on ***,这表明它实际上并没有挂起,只是需要很长时间。您如何确定“永远”真的是“永远”? 好吧,我等了至少 2 分钟。这是非常不可接受的(即使它不是“永远”)。 【参考方案1】:

1) 不仅要检查您是否拥有最新的 Xamarin Studio 版本,还要检查您是否拥有最新版本!!!

错误报告:

Troy Dawson 在一个多月前使用 Xamarin Studio 版本 5.5(内部版本 198) 报告了此问题:https://bugzilla.xamarin.com/show_bug.cgi?id=23444

“带有来自 alpha 发布通道的最新 Mono,附加项目 在以下位置运行时应引发 typenotfound 异常:

var image = Image.FromStream(content);

因为GDIPlus无法初始化什么的。

这类似于我提交的另一个错误 Image.FromStream() 采取 首次运行 Mono 时要返回很长时间。”

完全例外:

类型初始化器抛出异常 System.Drawing.GDIPlus ---> System.Exception: GdiplusStartup

解决方案:

在 2014 年 9 月 29 日报告该错误一天后,Sadik Ali 确认他可以重现该问题 Comment 1,然后 4 天后 Troy Dawson 确认 Xamarin Studio 版本 5.5(内部版本 227)修复了该问题 Comment 2.


2)如果最新版本仍然失败,我建议您通过限制并确保支持您正在加载的图像: https://github.com/mono/libgdiplus/blob/master/TODO

【讨论】:

【参考方案2】:

问题在于 MonoMac GDI 与 Mac 字体交互的方式。第一次启动时,它会构建它需要的字体缓存,这实际上需要几分钟。让它运行一段时间。一旦构建了字体缓存,这种延迟就会消失。

如果你杀死它,它永远不会完成缓存的构建,而且每次都会发生。遗憾的是,他们甚至还没有打印出任何类型的对话或消息来表明这种情况正在发生。

在极少数情况下,您的字体缓存目录可能无法由 mono 写入。在这种情况下,您可以以 root 身份运行应用程序一次,也可以关注instructions here。

【讨论】:

【参考方案3】:

问题可能是性能。你的代码应该运行良好;图片只是需要更长的时间来加载,这是因为单声道的 System.Drawing 只是一个 C# 包装器

可悲的是,mono 的 System.Drawing 在提供 System.Drawing 中的所有功能时存在重大问题。 Windows 运行良好,因为它使用本机 GDIPlus.dll,但您的代码在基于 unix 的系统中可能无法正常运行。

See more info about mono's System.Drawing here

根据您使用它的方式,有更好的 System.Drawing 替代品。

MonoMac 建议Mono.Cairo

This *** post may be useful as well

【讨论】:

但是,真的;两分钟加载我认为是一个小图像(也许我不应该假设)?这不仅慢,而且坏了。 试一试我链接的一些替代方案,看看是否能改善情况。这不是 System.Drawing 第一次在单声道上无法正常工作

以上是关于Image.FromFile() 或 FromStream() 在 GdiplusStartup 上挂起的主要内容,如果未能解决你的问题,请参考以下文章

Image.FromFile 方法锁住文件解决方法

Image.FromFile 是不是为无效的图像格式抛出 OutOfMemoryException 的原因?

除非我使用Image.FromFile,否则Image.SelectActiveFrame为何在多页TIFF的最后一帧上失败(“ GDI +中发生一般错误”)?

System.Drawing.GDIPlus.CheckStatus System.Drawing.Image.FromFile System.ArgumentException [GDI + sta

C# 相对路径

pictrue获取图片的三种方式