我有一個大的System.Drawing.Bitmap(14399 X 10799),我正在嘗試使用AFORGE.NET進行處理。我的算法對於較小的圖像效果很好,但在調用Process()時,如果圖像的大小接收到OutOfMemoryException。OutOfMemoryException使用AFORGE.NET ProcessImage
在調用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'大於「位圖」區域。在將其捕捉到「bitmapData」之前,檢查「位圖」的尺寸。 –
_「我懷疑這個例外與記憶無關」_ - 例外幾乎不存在。 _「我怎樣規避它?」 - 通過大塊處理你的圖像。 – CodeCaster
32位進程不會引發OOM,因爲它完全沒有內存,當它找不到足夠大的空洞以適應分配時,會發生kaboom。你的圖片需要一個足夠大的空間來容納622兆字節,這很難實現。一段時間以前微不足道的問題,64位操作系統是普遍可用的。將平臺目標設置更改爲AnyCPU以利用它。 –