图像大小调整中的OutOfMemoryException

时间:2012-05-10 10:19:48

标签: image resize out-of-memory

我们正在使用.net dll(http://imageresizing.net/download)在运行时进行图像处理。它完美地运作。但是,它发生在一段时间后(1-7天之间)系统开始在偶数查看器中引发异常:

异常信息:     异常类型:OutOfMemoryException     异常消息:内存不足,无法继续执行程序。

在该异常之后,网站通常会停止使用抛出“System.OutOfMemoryException”的错误。

如果我们“回收”运行网站的应用程序池,它会清除问题,网站会立即恢复正常,而不会更改任何代码。

在图像重新映射之前,我们使用的是自定义代码,同样的问题也会发生。以下是代码。

    private Bitmap ConvertImage(Bitmap input, int width, int height, bool arc)
    {
        if (input.PixelFormat == PixelFormat.Format1bppIndexed ||
            input.PixelFormat == PixelFormat.Format4bppIndexed ||
            input.PixelFormat == PixelFormat.Format8bppIndexed)
        {

            Bitmap unpackedBitmap = new Bitmap(input.Width, input.Height);
            Graphics g = Graphics.FromImage(unpackedBitmap);
            g.Clear(Color.White);
            g.DrawImage(input, new Rectangle(0,0,input.Width, input.Height));
            g.Dispose();
            input = unpackedBitmap;
        }


        double aspectRatio = (double)input.Height / (double)input.Width;
        int actualHeight = CommonMethods.GetIntValue(Math.Round(aspectRatio * width, 0));


        Bitmap _imgOut;

        if (actualHeight > height)
        {
            ResizeImage resizeImage = new ResizeImage(width, actualHeight, InterpolationMethod.Bicubic);
            Bitmap _tempBitmap = resizeImage.Apply(input);

            Bitmap _croppedBitmap = new Bitmap(width, height);
            Graphics _crop = Graphics.FromImage(_croppedBitmap);
            _crop.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            _crop.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            _crop.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            _crop.DrawImageUnscaledAndClipped(_tempBitmap, new Rectangle(0, 0, width, height));
            _crop.Dispose();

            _imgOut = _croppedBitmap;
        }
        else
        {
            ResizeImage resizeImage = new ResizeImage(width, height, InterpolationMethod.Bicubic);
            _imgOut = resizeImage.Apply(input);
        }

        // Draw the arc if it has been requested
        if (arc)
        {
            Graphics _arc = Graphics.FromImage(_imgOut);
            _arc.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            _arc.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            _arc.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            _arc.DrawArc(new Pen(Color.White, 24), new Rectangle(-13, -13, 50, 50), 180, 90);
            _arc.Dispose();
        }

        // job done
        return _imgOut;
    }

我们正在调整图像大小如下:www.mysite.com/images/myimage.jpg?width = 196& high = 131

期待。 法鲁克

1 个答案:

答案 0 :(得分:2)

当遇到OutOfMemoryException(无论它出现在何处)时,它可能是由应用程序中任何位置的内存泄漏引起的。用WinDbg调试了几十个这样的实例后,我从来没有发现任何最终由于http://imageresizing.net中的错误。

也就是说,有一种简单的方法可以确定它是否是http://imageresizing.net的问题;在IIS中创建单独的应用程序池和子文件夹应用程序,以便为图像和图像大小调整大小。除图像缩放器外,不安装任何其他设备。下次遇到错误时,请登录服务器并find out which w3wp.exe instance is responsible for the massive memory usage

如果它在ImageResizer应用程序池中,请从http://imageresizing.net/support收集$ 20- $ 50的错误奖励。如果没有,你需要找出你在主应用程序中泄漏的东西。

如果您正在使用应用程序中其他任何位置的System.Drawing,那么这是第一个要查看的地方。 Check your code against this list of pitfalls

如果你肯定你正在处理using或finally子句中的每个System.Drawing。*实例,那么请阅读this excellent article a few times以确保你没有失败任何基础知识,然后挖掘使用DebugDiag和/或WinDBG(参见bottom of article)。