2012-03-25 104 views
1

當嘗試使用SelectActiveFrame將圖像幀添加到圖像列表時,會出現Out of Memory異常。如果我處理的頁數少於174頁,則所有的作品都是100%,但任何超過此數量的頁面都會產生此錯這是我的代碼最簡單的形式;OutOfMemoryException將許多圖像幀添加到圖像列表

var scannedImage = (Bitmap)Image.FromFile(@"C:\Users\rbl\Documents\Modelware\City Prop\TIFF Files\barcodememory.tiff"); 
var dim = new FrameDimension(scannedImage.FrameDimensionsList[0]); 
var imageCount = scannedImage.GetFrameCount(dim); 
var currentBatch = new List<Image>(); 

for (var i = 0; i < imageCount; i++) 
{ 
scannedImage.SelectActiveFrame(dim, i); 

currentBatch.Add(new Bitmap(scannedImage)); 
// Above experiences following error after +/- 174 pages 
//System.OutOfMemoryException was unhandled 
//Message=Out of memory. 
//Source=System.Drawing 
} 
+0

要驗證它是否是內存問題,只需調暗並創建200個空的位圖。爲了清楚起見,使用少一點'var'。 – 2012-03-25 18:42:23

+0

不要相信這是以65%的速度運行的物理內存。重新使用增值稅,他們被ReSharper推薦如此有趣地聽說這不是好的做法。謝謝。我其實懷疑這個不好 – 2012-03-26 12:15:53

+0

別看TaskMan,運行一些代碼。 OOM可能由LOH的碎片引起。 – 2012-03-26 12:19:20

回答

0

您的內存不足。你需要分批加載圖像(只需加載你需要的東西,並卸載它,因爲你不再需要它。)

反正......我不明白你爲什麼需要幾個位圖。只要做到new Bitmap(...)一次,重複使用(除非你貼的代碼實際上是不是你真正的代碼,你正在處理幾個scannedImage內部的for循環。)

+0

謝謝。我已經監視了我的記憶,但沒有看到任何跡象表明這已經用完了。物理內存運行在65%。關於「新的位圖(scannedImage)」一次,然後重新使用相同的圖像 - 我相信我的代碼是正確的,因爲我不是每次都使用相同的圖像。我正在處理多頁TIFF文件,每次使用174頁圖像的新幀(SelectActiveFrame)。 – 2012-03-26 12:11:23

0

有趣的是,我能解決我的問題,通過轉換幀到字節流,然後返回到圖像。以下工作100%(不知道爲什麼,或者這是否是一個好的解決方案)。

for (int i = 0; i < pageCount; i++) 
{ 
    image.SelectActiveFrame(dim, i); 
    var byteStream = new MemoryStream(); 
    image.Save(byteStream, ImageFormat.Bmp); 
    frames[i] = Image.FromStream(byteStream); 
}