在ASP.NET/C#中进行图像处理,不使用System.Drawing/GDI+。

12

有没有适用于.NET的替代性图片处理库?我更喜欢一些托管且开源的东西。

我之所以问这个问题,是有两个原因:

  1. 我以前曾遇到过难以调试的GDI+错误。
  2. 我读到过在ASP.NET Web应用程序中使用System.Drawing不是100%受支持的。

谢谢!

编辑:澄清一下,我知道System.Drawing可以在ASP.NET Web应用程序中工作——我以前使用过它。我只是想知道是否有任何适用于.NET的托管图像处理库 :)


托管位图操作本质上是缓慢的。几乎任何可用的东西都将是托管包装器,因为需要汇编级别的优化(SSE)才能获得快速的JPEG编码和解码。我建议您查看ImageResizing.Net库。它可以满足大多数人的需求,并处理所有GDI的错误和怪癖。它还被认为可以正确地运行具有数百万张图片和数百万访问者的网站。 - Lilith River
4个回答

4
你应该研究一下.NET 3.0附带的WPF图像库。它们经过优化和强大(用于运行Aero,所以你知道它们是高效的)。它们不依赖于WPF调度程序,易于扩展,并得到官方支持。你还能想要什么呢?

相信 Aero 不是在 WPF 上运行的,因为您不需要安装 .NET 就可以让 Aero 在 Windows 上工作。 - rossisdead
明显地,WPF 在通过 ASP.NET 运行时存在问题。请参阅 Bertrand Le Roy 的“更新”和评论部分 -- http://weblogs.asp.net/bleroy/archive/2010/01/21/server-side-resizing-with-wpf-now-with-jpg.aspx。 - EBarr

2

我不知道是否有完全托管的免费或开源的2D绘图库(似乎有一些商业可用的,但OSS是最好的选择)。然而,你可以研究一下Mono对Cairo的绑定

Cairo是一个平台无关的2D绘图API。你可以在Cairo主页找到更多信息。Cairo维基百科页面也有一些很好的信息。

Cairo在开源世界中也被广泛使用,这对我来说说明了它的稳健性。Mozilla、Webkit和Mono都在使用它,还有其他的。具有讽刺意味的是,Mono实际上使用它来支持他们的System.Drawing实现……很难想象吧。

可能也有一种方法可以使用Mono的System.Drawing实现作为Microsoft实现的替代品,不过我不确定如何操作,甚至是否可行。我可能会从将System.Drawing.dll引用替换为Mono版本开始,然后尝试解决任何错误。


Mono的System.Drawing有点不完整...比如,DrawImage没有实现很多重载...我正在尝试找到一种解决方法,以便在http://imageresizing.net库中支持Mono。 - Lilith River
最新版本的Mono支持DrawImage,因此现在许多操作都可以正常工作。 - Lilith River

1

个人经验 #1:我曾在ASP.NET中使用GDI+进行即时图像创建,没有遇到任何问题。我甚至不知道会有什么问题。


System.Drawing 命名空间不受支持,微软已经明确表示:http://msdn.microsoft.com/en-us/library/system.drawing.aspx 因此,遇到严重问题的可能性是存在的。 - noocyte

0
关于(1),大多数难以调试的错误是由于未关闭打开的句柄(在托管代码中使用Dispose())引起的。我很好奇你从哪里听到了(2)。

1
微软在.NET文档中对(2)发出了警告:http://msdn.microsoft.com/en-us/library/system.drawing.aspx - Morten Mertner

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