0

我需要加载批量图像文件并更改它们的尺寸。我是通过 C++ 中的 FreeImage.dll 来实现的。每个批次都包含 JPG 和 TIF 文件。问题是 exe 准确地处理了第一批,但对于更多的批次,它开始跳过一些文件,特别是 JPG 文件。

我在每批之前和之后都尝试过初始化和取消初始化 FreeImage,但它仍然不起作用。

任何人都可以建议我这样做的方法吗?即使我需要使用其他一些对我来说很好的免费图像处理库。

4

1 回答 1

0

听起来好像 FreeImage 正在泄漏内存,或者内存在调用 FreeImage 的代码中变得支离破碎。在进程生命周期的早期,仍然有足够的连续内存可用,并且一切正常。后来,在较大的彩色图像上,事情开始失败。特别是 jpeg 失败的原因是因为彩色图像的内存图像总是每像素至少需要 24 位(可能是 32 位),即使它在磁盘上的大小要小得多。您的 tiff 图像可能是黑白的,然后每个像素只需要 1 位。

如果没有释放每个已处理图像的所有内存(在 FreeImage.dll 中或在您自己的程序中),那么即使保留使用的内存量很小,也会在连续运行的进程中产生问题。问题是内存会变得碎片化,操作系统无法在单个进程的内存空间中重新定位碎片。为了加载大图像,需要大的连续内存块,并且在碎片内存中可能不再有足够大的空闲“洞”,即使整体空闲空间仍然足够。一个简单的解决方法是为每个要处理的图像生成一个单独的进程,并让主进程只进行任务管理。但是,这会使您的程序稍微复杂一些,并且如果工作进程可能挂起,则可能会导致稳定性问题。

于 2011-10-20T12:51:57.550 回答