C# OutOfMemoryException将许多图像帧添加到图像列表

C# OutOfMemoryException将许多图像帧添加到图像列表,c#,image,out-of-memory,C#,Image,Out Of Memory,当尝试使用SelectActiveFrame向图像列表添加图像帧时,出现内存不足异常。如果我处理的页面少于174页,所有都可以100%正常工作,但超过此范围的任何内容都会产生此错误。以最简单的形式,我的代码是 var scannedImage = (Bitmap)Image.FromFile(@"C:\Users\rbl\Documents\Modelware\City Prop\TIFF Files\barcodememory.tiff"); var dim = new FrameDimens

当尝试使用SelectActiveFrame向图像列表添加图像帧时,出现内存不足异常。如果我处理的页面少于174页,所有都可以100%正常工作,但超过此范围的任何内容都会产生此错误。以最简单的形式,我的代码是

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
}

您的内存不足。您需要批量加载图像,只需加载所需的图像,然后在不再需要时卸载即可


无论如何。。。我不明白你为什么需要几个位图。只要做新的位图。。。一次,重复使用它,除非你粘贴的代码实际上不是你的真实代码,并且你在for循环中处理了几个scannedImage。

有趣的是,我能够通过将帧转换为bytestream,然后再转换回图像来解决我的问题。以下方法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);
}

要验证这是否是内存问题,只需获取dim并创建200个该大小的空位图。为了清楚起见,使用较少的var。不要认为这是内存,因为物理内存的运行率为65%。当我使用vars时,ReSharper推荐了vars,听上去很有趣,这不是一个好的实践。谢谢我怀疑这不好,不要看TaskMan,运行一些代码。OOM可能由LOH的碎片引起。谢谢。我已经监控了我的记忆,但没有看到任何迹象表明这已经用完了。物理内存以65%的速度运行。关于做一次新的BitmapscannedImage,然后重新使用相同的图像,我相信我的代码是正确的,因为我不是每次都使用相同的图像。我正在使用一个新的框架处理多页TIFF文件,每次选择174页图像的ActiveFrame。