2014-02-11 40 views
0

我有一個大的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'的異常被拋出。

+0

這幾乎總是涉及到'Rectangle'大於「位圖」區域。在將其捕捉到「bitmapData」之前,檢查「位圖」的尺寸。 –

+0

_「我懷疑這個例外與記憶無關」_ - 例外幾乎不存在。 _「我怎樣規避它?」 - 通過大塊處理你的圖像。 – CodeCaster

+0

32位進程不會引發OOM,因爲它完全沒有內存,當它找不到足夠大的空洞以適應分配時,會發生kaboom。你的圖片需要一個足夠大的空間來容納622兆字節,這很難實現。一段時間以前微不足道的問題,64位操作系統是普遍可用的。將平臺目標設置更改爲AnyCPU以利用它。 –

回答

0

如果圖像包含大量斑點,則內存使用率可能會相當高。您是否嘗試過使用相同尺寸的空白圖片?

如果確實是由於圖像中有太多斑點引起的,可以嘗試在斑點過濾中添加更多約束條件。

0

我有simillar問題, 只使用ResizeBilinear過濾器或Aforge.Imaging.Filters中的任何其他調整大小過濾器(如果您正在處理它只是爲了獲取某些信息,則不需要全部質量的圖像)以及任何修改你想對源圖像它是由爲對象縮減的點做了你發現下面是一個簡單的方法來獲得暫時的按比例縮小圖像處理

Bitmap ResizeMyImage(Bitmap Source, int scalefactor) 
     { 
      int newHeight = Source.Height/scalefactor; 
      int newWidth = (int)(Source.Width * (newHeight/(float)Source.Height)); 
      ResizeBilinear filter = new ResizeBilinear(newWidth, newHeight); 
      return filter.Apply(Source); 
     }