2

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

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

在该异常之后,网站通常会停止工作,并抛出“System.OutOfMemoryException”错误。

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

在 imagereiszing dll 之前,我们使用的是自定义代码,同样的问题也会发生。以下是代码。

    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&height=131

期待。法鲁克

4

1 回答 1

2

当您遇到 OutOfMemoryException(无论它发生在何处)时,它可能是由应用程序中任何地方的内存泄漏引起的。在使用 WinDbg 调试了几十个这样的实例后,我从未发现任何最终是由于http://imageresizing.net中的错误而导致的。

也就是说,有一种简单的方法可以确定http://imageresizing.net是否存在问题;在 IIS 中为您的图像和图像调整大小创建一个单独的应用程序池和子文件夹应用程序。除了图像缩放器之外,什么都没有安装在那里。下次遇到错误时,请登录服务器并找出导致大量内存使用的 w3wp.exe 实例

如果它在 ImageResizer 应用程序池中,请从http://imageresizing.net/support收集 20-50 美元的错误赏金。如果没有,您需要弄清楚您在主应用程序中泄漏的位置。

如果您在应用程序中的其他任何地方使用 System.Drawing,那是第一个查看的地方。对照此陷阱列表检查您的代码

如果您确定要在 using 或 finally 子句中处理每个 System.Drawing.* 实例,请阅读这篇优秀的文章几次,以确保您没有在任何基础上失败,然后深入了解DebugDiag 和/或 WinDBG(见文章底部)。

于 2012-05-11T12:43:23.933 回答