在跟踪了奇异的GDI +错误几天后,我偶然发现了MSDN上的这个小地方:
Windows或ASP.NET服务中不支持使用System.Drawing命名空间中的类。尝试从这些应用程序类型之一中使用这些类可能会产生意外问题,例如服务性能下降和运行时异常。
我不知道在这种情况下“ ASP.NET服务”是否意味着“ Web应用程序”,但是“服务性能下降”似乎可以覆盖“ GDI +中发生的一般错误”和“内存不足”错误的随机组合。我的应用正在抛出-读写JPEG图像时出现间歇性,不可再现的错误-在许多情况下- 最初实际上是由System.Drawing.Imaging创建的。
因此-如果GDI +无法在Web应用程序中可靠地读写JPEG文件,我应该使用什么呢?
我希望用户能够上载图像(需要JPEG,其他格式很好用),对其进行 可靠地 重新采样,并在出现任何问题时显示有用的错误消息。有任何想法吗?WPF中的System.Media命名空间值得考虑吗?
编辑: 是的,我知道GDI +在大多数时间都有效。这还不够好,因为当它失败时,这样做的方式是无法将其正常隔离或恢复。我对适合您的GDI +代码示例不感兴趣:我正在寻找 用于图像处理的替代库。
在TopTen Software Blog上有一篇很棒的博客文章,其中包括有关通过Interop 使用ImageMagick图形库的 C#代码。这篇文章专门讨论了在mono下在Linux上运行ASP.net的问题。但是,C#代码应该是完全可复制粘贴的,如果要在运行Windows的窗口中引用窗口二进制(DLL),则只需更改Interop属性即可。
ImageMagick®是用于创建,编辑,合成或转换位图图像的软件套件。它可以读取和写入各种格式(超过100种)的图像,包括DPX,EXR,GIF,JPEG,JPEG-2000,PDF,PhotoCD,PNG,Postscript,SVG和TIFF。使用ImageMagick可以调整图像大小,翻转,镜像,旋转,变形,剪切和变换图像,调整图像颜色,应用各种特殊效果或绘制文本,线条,多边形,椭圆和贝塞尔曲线。
在Codeplex上还有一个ImageMagick .Net开发项目,可以为您完成所有工作。但是自2009年以来,它没有显示出积极的发展,因此它可能落后于当前的ImageMagick库版本。对于小的琐碎的调整大小例程,我可能会坚持使用互操作性。您只需要仔细观察自己的内存泄漏或未释放资源的实现即可(库本身已经过社区的良好测试和审查)。
该库是免费的开放源代码。Apache 2许可证似乎与个人和商业目的兼容。请参阅ImageMagick许可页面。
该库是完全跨平台的,并实现了许多功能强大的图像处理和转换例程,这些例程在GDI +中找不到(或未在mono下实现),并作为ASP.net图像处理的替代品而享有盛誉。
更新:似乎这里有.NET包装的更新版本:http : //magick.codeplex.com/