看起来很容易使用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可以在这里探索.