我需要加载批量的图像文件并更改其尺寸。我是通过C ++中的FreeImage.dll来实现的。每批包含JPG和TIF文件。问题是exe准确处理第一批,但是对于进一步的批次,它开始跳过一些文件,特别是JPG文件。
我尝试在每批次之前和之后初始化和取消初始化FreeImage,但它仍然不起作用。
有人可以建议我这样做吗?即使我需要使用其他一些对我来说也没问题的免费图像处理库。
答案 0 :(得分:0)
听起来好像FreeImage正在泄漏内存或内存在调用FreeImage的代码中碎片化。在您的过程的生命周期的早期,仍然有足够的连续内存,一切正常。后来,在较大的彩色图像上,事情开始失败。特别是jpegs失败的原因是因为彩色图像的存储器图像总是至少需要每像素24位(可能是32位),即使它在磁盘上的尺寸要小得多。您的tiff图像可能是黑白图像,然后每像素只需要1位。
如果没有释放每个处理过的图像的所有内存(在FreeImage.dll或您自己的程序中),这会在连续运行的进程中产生问题,即使使用的内存量很小。问题是内存将变得碎片化,并且操作系统无法将片段重新定位到单个进程的内存空间中。对于加载大图像,需要大的连续内存块,并且在碎片存储器中可能不再有足够大的自由“孔”,即使整个可用空间仍然足够。一个简单的解决方法是为每个要处理的映像生成一个单独的进程,并使主进程只进行任务管理。但是,这会使您的程序稍微复杂一些,如果工作进程可能挂起,可能会导致稳定性问题。