我们正在使用.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
期待。 法鲁克
答案 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)。