【发布时间】:2015-08-07 11:40:54
【问题描述】:
我制作了一个程序,它分析图像的第一个像素,然后在列表中记录它的值,这是为了检查图像是黑白的还是彩色的。现在,有谁知道读取高分辨率图像的有效方法?现在我正在使用位图,但它们效率很低。这些图像每个大约 18 兆像素,我想分析大约 400 张照片。代码如下:
Bitmap b;
foreach (FileInfo f in files) {
// HUGE MEMORY LEAK
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
b = (Bitmap)Bitmap.FromFile(f.FullName);
// reading pixel (0,0) from bitmap
当我运行我的程序时,它会说:
"An unhandled exception of type 'System.OutOfMemoryException' occurred in System.Drawing.dll
Additional information: There is no available memory."
如您所见,我已尝试使用 System.GC.Collect() 进行清理,但异常并没有消失。如果我分析一个只包含几张照片的文件夹,程序运行良好并且很乐意完成它的工作。
【问题讨论】:
-
文件列表来自哪里?如果您在创建 Bitmap 对象之前预加载目录中的所有文件,它们都已经在内存中。我会以 List
的形式获取目录中的文件名列表,然后遍历每个文件名,加载单个文件对象并确保它之后为空。手动调用 GC 是一个非常糟糕的主意,因为它没有解决内存使用的根本原因。 -
另外,看看 PixelFormat 以确定颜色深度。查看第一个像素来确定图像是否为彩色不是一种可靠的方法。如果第一个像素是黑色或白色,您不知道它是灰度、单色还是带有黑色/白色背景的彩色。 msdn.microsoft.com/en-us/library/…。这篇 SO 帖子可能对您有用 - stackoverflow.com/questions/2150504/…
-
您能否仔细检查问题是否真的是文件数量,而不是您的多文件方案包含更大的图像? .NET 对对象的最大大小有限制。
-
你记得处理吗?
标签: c# .net memory-leaks photos