2012-03-25 67 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); 
}