ASP.NET创建缩略图服务器端

看起来很容易使用System.Drawing在ASP.NET应用程序中创建缩略图.但是
MSDN tells you

Classes within the System.Drawing namespace are not supported for use within a Windows or ASP.NET service. Attempting to use these classes from within one of these application types may produce unexpected problems, such as diminished service performance and run-time exceptions.

我在这种类型的GDI代码中看到间歇性的“内存不足”错误.我开始怀疑这是原因.

人们如何进行服务器端图像处理?任何人都可以推荐任何不会炸毁我的服务器的替代方案吗?

以下相关代码. System.Drawing.Graphics.DrawImage中间歇性地发生异常.我刚刚继承了这个项目,所以我需要检查日志,看看这个被击中的次数/我们获得异常的频率……

public byte[] Resize(int newWidth, int newHeight, Image orignalImage)
{
    Bitmap bitmap = new Bitmap(newWidth, newHeight);
    Graphics g = Graphics.FromImage(bitmap);
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

    Rectangle r = new Rectangle(0, 0, newWidth, newHeight);
    g.DrawImage(orignalImage, r, r.X, r.Y, orignalImage.Width, orignalImage.Height, GraphicsUnit.Pixel);

    MemoryStream stream = new MemoryStream();
    bitmap.Save(stream, ImageFormat.Jpeg);

    // clean up memory leaks
    if (bitmap != null)
    {
        bitmap.Dispose();
        bitmap = null;
    }
    if (g != null)
    {
        g.Dispose();
        g = null;
    }


    return stream.ToArray();
}

更新:我通过整个项目搜索我们正在使用GDI的任何地方,并使用(){}围绕IDisposable的所有内容.自从我这样做以来,我没有看到一个“内存不足”异常.

最佳答案 假设你将按要求做“东西”,问题可能就是

>处理器密集型操作:处理图像,这可能需要一些时间.
>如果您要保存文件,则会导致磁盘问题.
>您可以考虑使用HTTP handlers,
>处理System.Drawing对象应该是一个优先级(using(){}语句)
> Asynchronous Pages可以在这里探索.

点赞