经过几天跟踪奇怪的GDI +错误,我偶然发现了MSDN上的这个小宝石:
System.Drawing命名空间中的类不支持在Windows或ASP.NET服务中使用.尝试在其中一种应用程序类型中使用这些类可能会产生意外问题,例如服务性能下降和运行时异常.
我不知道"ASP.NET服务"在这种情况下是否意味着"Web应用程序",但"服务性能降低"当然似乎涵盖了"GDI +中出现一般性错误"和"内存不足"错误的随机分类我的应用程序正在抛出 - 读取和写入JPEG图像的间歇性,不可重现的错误 - 在许多情况下 - 实际上是由System.Drawing.Imaging首先创建的.
那么 - 如果GDI +无法在Web应用程序中可靠地读取和写入JPEG文件,那么我应该使用什么呢?
我希望用户能够上传图像(需要JPEG,其他格式很好),可靠地重新采样,并在出现任何问题时显示有用的错误消息.有任何想法吗?WPF的System.Media命名空间值得考虑吗?
编辑:是的,我知道GDI +"大部分时间都在工作".这还不够好,因为当它失败时,它会以一种无法隔离或优雅地恢复的方式这样做.我对适合您的GDI +代码示例不感兴趣:我正在寻找用于图像处理的替代库.
当尝试使用单声道版本的System.Drawing.Bitmap对象在OSX 10.7.3上加载".bmp",".png"或".jpg"时,应用程序只会挂起.我没有得到任何错误,应用程序只是卡在Bitmaps构造函数上...
当我在(Arch)Linux或Windows上运行相同的代码时,一切正常.
public static void Main (string[] args)
{
using (var bitmap = new Bitmap("/....../image.bmp"))
{
}
Console.WriteLine ("Hello World!");// Never gets here...
}
Run Code Online (Sandbox Code Playgroud)
如果我在调试模式下暂停应用程序,它会打开"反汇编"窗口并显示它卡在这一行:
call Status System.Drawing.GDIPlus:GdiplusStartup (UInt64, GdiplusStartupInput, GdiplusStartupOutput)
Run Code Online (Sandbox Code Playgroud)
注意:在调试模式下暂停应用程序几次后,"Magically"在写入时开始工作.我承诺我没有更改任何代码.谁知道什么可以导致"System.Drawing.GDIPlus"挂起所以我知道如何避免它?是否有单声道的codex设置文件或可能有垃圾箱的东西?