内存不足 - Graphics.DrawImage

时间:2013-10-22 07:16:38

标签: c# asp.net image

我得到了一些从数据库中检索图像的代码,然后重新调整大小以便在某些页面上显示。 但是我在某些图像上出现“内存不足”错误。

在我目前的情况下,我只在一张图像上得到它,其余的图像都可以正常工作。

请参阅下面的代码。我错过了什么吗?我没有正确释放物体吗?或者我的一些使用陈述应该改进? canvas.DrawImage行给出错误。 我非常感谢您在我的代码中找到错误的任何帮助。

平台构建是:任何CPU 我的操作系统:Win 7 64bit

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;
}

由于

1 个答案:

答案 0 :(得分:0)

在循环中处理多个图像时遇到了类似的问题。我这样解决了: - 我确保只要不再需要图像,位图对象等。 - 我在抛出异常的方法的开头添加了GC.Collect()。

看起来,一般来说,当你处理图形时,你最好有时候明确地称之为垃圾收集器。

现在,您的计算机可能实际上缺乏记忆,但这可能有助于进一步推动治疗。