题
使用System.Drawing在ASP.NET应用程序中创建缩略图看起来非常容易。但 MSDN告诉你:
不支持在Windows或ASP.NET服务中使用System.Drawing命名空间中的类。尝试在其中一种应用程序类型中使用这些类可能会产生意外问题,例如服务性能下降和运行时异常。
我在这种类型的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 +的任何地方,并将 using(){}
放在 IDisposable
的所有内容周围>。自从我这样做以来,我没有看到一个“内存不足”的异常。
其他提示
为什么不设置通过Web服务公开的单独工作服务器。
我建议你在这些操作中加入一些异常处理代码,这样你就可以保证丢弃你的GDI +对象。关闭你的溪流的好习惯......虽然据我所知 MemoryStream
对象是管理的,所以当GC'd关闭时。
不隶属于 StackOverflow