用于ASP.NET的System.Drawing的替代方案?

Dyl*_*tie 32 c# asp.net system.drawing gdi+ system.drawing.imaging

经过几天跟踪奇怪的GDI +错误,我偶然发现了MSDN上的这个小宝石:

System.Drawing命名空间中的类不支持在Windows或ASP.NET服务中使用.尝试在其中一种应用程序类型中使用这些类可能会产生意外问题,例如服务性能下降和运行时异常.

我不知道"ASP.NET服务"在这种情况下是否意味着"Web应用程序",但"服务性能降低"当然似乎涵盖了"GDI +中出现一般性错误"和"内存不足"错误的随机分类我的应用程序正在抛出 - 读取和写入JPEG图像的间歇性,不可重现的错误 - 在许多情况下 - 实际上是由System.Drawing.Imaging首先创建的.

那么 - 如果GDI +无法在Web应用程序中可靠地读取和写入JPEG文件,那么我应该使用什么呢?

我希望用户能够上传图像(需要JPEG,其他格式很好),可靠地重新采样,并在出现任何问题时显示有用的错误消息.有任何想法吗?WPF的System.Media命名空间值得考虑吗?

编辑:是的,我知道GDI +"大部分时间都在工作".这还不够好,因为当它失败时,它会以一种无法隔离或优雅地恢复的方式这样做.我对适合您的GDI +代码示例不感兴趣:我正在寻找用于图像处理的替代库.

Ben*_*yne 10

有一篇很棒的博客文章,包括在TopTen软件博客上通过Interop 使用ImageMagick图形库的 C#代码.这篇文章专门讨论在单声道Linux上运行ASP.net; 但是,C#代码应该是完全可以复制粘贴的,如果您在引用窗口二进制文件(DLL)的Windows下运行,则唯一需要更改的是Interop属性.

ImageMagick®是一个用于创建,编辑,撰写或转换位图图像的软件套件.它可以读取和写入各种格式(超过100种)的图像,包括DPX,EXR,GIF,JPEG,JPEG-2000,PDF,PhotoCD,PNG,Postscript,SVG和TIFF.使用ImageMagick调整大小,翻转,镜像,旋转,扭曲,剪切和变换图像,调整图像颜色,应用各种特殊效果,或绘制文本,线条,多边形,椭圆和Bézier曲线.

在Codeplex上还有一个ImageMagick .Net开发项目,它为你包装了一切.但它自2009年以来并未显示出积极的发展,因此它可能落后于当前的ImageMagick库版本.对于一个小小的调整大小例程,我可能会坚持使用互操作.您只需仔细观察您的实现是否存在内存泄漏或未发布的资源(该库本身经过社区测试和审核).

该库是免费和开源的.Apache 2许可证似乎兼容个人和商业用途.请参见ImageMagick许可证页面.

该库完全是跨平台的,并且实现了许多强大的图像处理和转换例程,这些例程在GDI +中找不到(或者没有在单声道下实现),并且作为ASP.net图像处理的替代品具有良好的声誉.

更新:看起来这里有一个.NET包装器的更新版本:http://magick.codeplex.com/


Dun*_*art 9

是的,使用WPF System.Windows.Media类.完全管理他们不会遇到与GDI相同的问题.

这是我用来渲染渐变的一些MVC代码的摘录,让您了解如何从WPF Visual到PNG:

using System;
using System.IO;
using System.Web.Mvc;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace MyMvcWebApp.Controllers
{
    public class ImageGenController : Controller
    {
        // GET: ~/ImageGen/Gradient?color1=red&color2=pink
        [OutputCache(CacheProfile = "Image")]
        public ActionResult Gradient(Color color1, Color color2, int width = 1, int height = 30, double angle = 90)
        {
            var visual = new DrawingVisual();
            using (DrawingContext dc = visual.RenderOpen())
            {
                Brush brush = new LinearGradientBrush(color1, color2, angle);
                dc.DrawRectangle(brush, null, new Rect(0, 0, width, height));
            }

            return new FileStreamResult(renderPng(visual, width, height), "image/png");
        }

        static Stream renderPng(Visual visual, int width, int height)
        {
            var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default);
            rtb.Render(visual);

            var frame = BitmapFrame.Create(rtb);
            var encoder = new PngBitmapEncoder();
            encoder.Frames.Add(frame);

            var stream = new MemoryStream();
            encoder.Save(stream);
            stream.Position = 0;

            return stream;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它们不是完全管理的,它们是WIC的包装器,它也是不受支持的(尽管文档说的是这样).他们有大多数相同的问题加上新问题. (15认同)
  • ASP.NET下也不支持WPF/WIC. (6认同)

Sim*_*ier 9

你可以在这里找到一篇来自Microsoft员工的非常好的文章:使用WPF/WIC而不是建议使用WPF而不是GDI +的GDI +来调整服务器中的图像.它更多的是缩略图,但它总体上是相同的问题.

无论如何,最后它说明了这一点:

我联系了WPF团队,以确定是否支持这一点.不幸的是,它不是,文档正在相应更新.对于可能导致的任何混淆,我深表歉意.我们正在研究如何使这个故事在未来更容易被接受.

所以WPF在Web应用程序中也不受支持,我仍然相信:-S


Mat*_*nda 5

图像锐利

ImageSharp是一个开源跨平台 2D 图形库。它是在新的 .NET 标准之上用 C# 编写的,不依赖于任何特定于操作系统的 API。

它目前仍在 MyGet 上预发布(您必须在 VS 选项或 NuGet.config 文件中添加包源),但我们已经在使用它并取得了一些非常积极的结果。