【发布时间】:2012-12-06 22:59:32
【问题描述】:
我刚刚从http://jpegclub.org/jpegtran/ 下载了最新的win32 jpegtran.exe 并观察到以下情况:
我准备了一个 14500 x 10000 像素的 24 BPP jpeg 测试图像。
- 文件系统中的压缩大小约为 7.5 MB。
- 解压到内存(使用一些图像查看器)会膨胀到大约 450 MB。
在无损旋转 (180) 期间监控 jpegtran.exe 命令行工具的内存消耗,我可以看到进程消耗高达 900 MB 内存!
我会假设这种 jpeg 无损转换 不需要将图像文件解码到内存中,而只需对编码文件本身执行一些数学转换 - 保持内存占用非常低。
那么下列哪项是正确的?
- 此特定工具的实现中存在一些错误
- 我错过了一些配置开关
- 我的一些误解(即 jpeg 无损转换也需要将图像解码到内存中?)
- “数学运算”比“将图像解码到内存”消耗更多的内存
编辑:
根据 JasonD 的回答,原因似乎是后者。所以我会扩展我的问题:
是否有任何实现可以在小块中执行这些操作(以避免高内存使用)?还是总是需要整体完成而没有办法解决?
PS:
我不打算实现我自己的编解码器/算法。相反,我问是否有任何满足我的要求的实现。或者至少理论上可以。
【问题讨论】:
-
尝试在小块中这样做的问题是输出块需要根据输入重新排序,并且块是可变长度的(因为压缩) - 所以你不能轻易地随机访问它们中的任何一个。也许,您可以对输入文件进行初始传递,而无需实际扩展它,以确定输入流中每个块的开始位置,然后按输出顺序进行处理。不知道是否有人编写过诸如解决方案之类的代码。
标签: memory jpeg codec imaging libjpeg-turbo