g.DrawImage抛出内存不足异常

时间:2015-04-17 14:16:45

标签: c# image graphics out-of-memory drawimage

在我的应用中,我正在处理大约30到70张大图像。通过工作我的意思是加载,裁剪,调整大小和添加到aviStream。每个图像最高可达4500p和10MB(使用如此大的图像可以获得大部分内存不足的例外情况)。在测试时,我有时使用较小的(每个2500p~500kB),内存情况要好得多。

我已将程序的体系结构更改为:加载一个图像,处理所需的操作,将其添加到流中,关闭它。并对下一张图片做同样的事情。但是由于代码的复杂性和大小,我并不是百分之百确定我处理并关闭在此过程中为临时目的而创建的每个位图和图像。

我有以下错误:

An unhandled exception of type 'System.OutOfMemoryException' occurred in System.Drawing.dll

通常在裁剪图像时:

public static Image Crop(Image imgPhoto, Point xy, int width, int height) {
        Rectangle cropRect = new Rectangle(xy, new Size(width, height));
        Bitmap target = new Bitmap(cropRect.Width, cropRect.Height);

        using (Graphics g = Graphics.FromImage(target)) {
            g.DrawImage(imgPhoto, new Rectangle(0, 0, target.Width, target.Height), cropRect, GraphicsUnit.Pixel);
        }

        return target;
    }

根据裁剪级别抛出异常,如果我裁剪大图像的一小部分,让我们说中间有800x600像素,那就更好了。如果以相反的方式裁剪,让我们说创建一个原始图像较小的3500x2500图像(空白区域将自动填充所选颜色),我大部分时间都有例外。

有一件有趣的事情是,在23号图像周围抛出异常,因此之前的图像处理得很好。

你们可以给我一个如何调试的建议吗?我试图扫描代码中的未曝光图像和位图,但似乎我没有找到所有这些。

因此,最大的问题是:如何一个一个地处理所有图像而没有例外?

1 个答案:

答案 0 :(得分:0)

如果你想在方法中创建一个位图,你必须在方法之外使用using块,我的意思是你在这里调用这样的方法:

using (var myNewBitmap = Crop(imgPhoto, xy, width, height) ) 
{

// do whatever you want with the bitmap 

}

使用后它将被处置,你不会得到例外。使用当前代码,您可以在将来获得内存不足。