【发布时间】:2014-02-11 23:41:26
【问题描述】:
我有一个很大的 System.Drawing.Bitmap (14399 X 10799),我正在尝试使用 AFORGE.NET 进行处理。我的算法在较小的图像上效果很好,但是对于这种大小的图像,当我调用 Process() 时会收到 OutOfMemoryException。
在调用 Process() 之前,我的任务管理器报告应用程序正在使用 613MB,而在异常发生时,它正在使用 609MB。
我尝试将我的平台目标设置为 x64,但这似乎不会影响异常的发生。
我怀疑异常与内存无关,而是其他的,如何规避?
// lock image
BitmapData bitmapData = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadWrite, bitmap.PixelFormat);
// step 1 - turn background to black
ColorFiltering colorFilter = new ColorFiltering();
colorFilter.Red = new IntRange(0, 64);
colorFilter.Green = new IntRange(0, 64);
colorFilter.Blue = new IntRange(0, 64);
colorFilter.FillOutsideRange = false;
colorFilter.ApplyInPlace(bitmapData);
// step 2 - locating objects
BlobCounter blobCounter = new BlobCounter();
blobCounter.FilterBlobs = true;
blobCounter.MinHeight = 5;
blobCounter.MinWidth = 5;
blobCounter.ProcessImage(bitmapData); //Crash
Blob[] blobs = blobCounter.GetObjectsInformation();
bitmap.UnlockBits(bitmapData);
引发了“System.OutOfMemoryException”类型的异常。
【问题讨论】:
-
这几乎总是与
Rectangle大于Bitmap区域有关。在将bitmap捕获到bitmapData之前检查它的尺寸。 -
“我怀疑异常与内存无关” - 异常几乎不会说谎。 “我怎样才能绕过它?” - 通过分块处理你的图像。
-
一个 32 位进程不会引发 OOM,因为它完全内存不足,当它找不到足够大的孔以适应分配时,它会卡布。您的图像需要一个足够大的孔来容纳 622 兆字节,这很难得到。很久以前就已经解决了一个问题,64 位操作系统是普遍可用的。将平台目标设置更改为 AnyCPU 以利用它。