在我的应用程序中,我正在处理大约30-70个大图像。我所说的工作是指加载、裁剪、调整大小和添加到aviStream。每个图像可以有高达4500p和10MB的内存(处理这样大的图像会给我带来大部分内存不足的例外)。在测试时,我有时会使用较小的(每个2500p~500kB),内存情况要好得多。
我已经改变了程序的架构:加载一个映像,处理所需的操作,将其添加到流中,关闭它。对下一个映像也这样做。但由于代码的复杂性和大小,我不能100%确定在这个过程中是否会处理并关闭为临时目的创建的每个位图和图像。
我有以下错误:
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像素,那更好。如果以opsite的方式裁剪,比如说创建一个3500x2500的图像,其中原始图像较小(空白区域将自动填充选定的颜色),我大多数时候都有例外。
还有一件有趣的事情是,在第23张图像周围抛出了异常,所以之前的图像处理得很好。
你们能给我一个如何调试的建议吗?我试着扫描代码中未显示的图像和位图,但似乎还没有找到所有的。
因此,最大的问题是:如何在没有例外的情况下逐一处理所有图像?
如果你想在方法内部创建位图,你必须在方法外部使用using块,我的意思是在你调用方法的地方,比如:
using (var myNewBitmap = Crop(imgPhoto, xy, width, height) )
{
// do whatever you want with the bitmap
}
使用后,它将被丢弃,您将不会得到异常。使用当前代码,您可以在将来获得内存不足的。