0
我得到了一些从数据库中检索图像的代码,然后重新调整大小以便在特定页面上显示。 但是,在某些图像上出现“内存不足”错误。内存不足 - Graphics.DrawImage
在我目前的情况下,我只在一个图像上得到它,其余的图像工作正常。
请参阅下面的代码。我错过了什么吗?我不正确地释放对象吗?或者我的一些使用声明应该改进? canvas.DrawImage行给出错误。 任何帮助定位我的代码中的错误将不胜感激。
平台版本是:任何CPU 我的操作系统:Win 7的64位
private byte[] SaveResizedImage(byte[] origImageBytes, int targetSize)
{
using (MemoryStream ms = new MemoryStream(origImageBytes))
using (Image origImage = Image.FromStream(ms))
{
Size newSize = CalculateDimensions(origImage.Size, targetSize);
using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb))
using (Graphics canvas = Graphics.FromImage(newImage))
{
canvas.SmoothingMode = SmoothingMode.AntiAlias;
canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
canvas.DrawImage(origImage, new Rectangle(new Point(0, 0), newSize)); <--- This line give the exception error
ImageCodecInfo codecInfo = GetEncoderInfo(ImageFormat.Jpeg);
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 75L);
using (MemoryStream newms = new MemoryStream())
{
newImage.Save(newms, codecInfo, encoderParams);
return newms.ToArray();
}
}
}
}
public static ImageCodecInfo GetEncoderInfo(ImageFormat format)
{
return ImageCodecInfo.GetImageEncoders().ToList().Find(delegate(ImageCodecInfo codec)
{
return codec.FormatID == format.Guid;
});
}
private static Size CalculateDimensions(Size oldSize, int targetSize)
{
Size newSize = new Size();
if (oldSize.Height > oldSize.Width)
{
newSize.Width = (int)(oldSize.Width * ((float)targetSize/(float)oldSize.Height));
newSize.Height = targetSize;
}
else
{
newSize.Width = targetSize;
newSize.Height = (int)(oldSize.Height * ((float)targetSize/(float)oldSize.Width));
}
return newSize;
}
感谢
GDI已知会在转换过程中抛出错误的OOM。您的问题可能是损坏的BMP文件或不支持的格式。或... –
图像有多大,即targetSize和origImage.Size的值是多少?你在32位或64位上运行?阅读:http://blogs.msdn.com/b/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx –
@KrisVandermotten那篇文章是不管怎样与这个问题有关。这是gdi +问题。 –