С виду System.Drawing выглядит довольно простым для создания миниатюр в вашем приложении ASP.NET. Но MSDN говорит вам :
Классы в пространстве имен System.Drawing не поддерживаются для использования в службе Windows или ASP.NET. Попытка использовать эти классы из одного из этих типов приложений может привести к непредвиденным проблемам, таким как снижение производительности службы и исключения во время выполнения.
Я вижу прерывистые ошибки «нехватки памяти» в этом типе кода 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
. С тех пор как я это сделал, я не видел ни одного исключения «недостаточно памяти».