我刚从http://jpegclub.org/jpegtran/下载了最新的win32 jpegtran.exe 并观察了以下内容:
我准备了一张24 BPP jpeg测试图像,图像为14500 x 10000像素。
在无损旋转期间监视jpegtran.exe命令行工具的内存消耗(180)我可以看到该进程消耗最多 900 MB 内存!
我会假设这样的 jpeg无损转换不需要将图像文件解码到内存中,而只是对编码文件本身执行一些数学转换 - 保持内存占用非常低。
以下哪项是真的?
修改
根据JasonD的回答,原因似乎是后者。所以我会延伸我的问题:是否有任何实现可以在小块中执行 (以避免高内存使用)?或者它总是需要在整体上完成而且没有办法解决它?
PS:
我不打算实现自己的编解码器/算法。相反,我问是否有任何实现符合我的要求。或者至少在理论上是否存在。
答案 0 :(得分:5)
我不知道有问题的库,但是为了在jpeg图像上执行无损旋转,你至少必须解压缩DCT系数才能旋转它们,然后重新压缩。 / p>
完全展开的DCT系数与原始图像数据的大小相同或更大,因为它们具有更多的信息位。
它是无损的,因为jpeg中的丢失是由DCT系数的量化引起的。只要您不对这些进行解码/重新编码/重新量化,就不会产生任何损失。
但它会占用大量内存。
jpeg压缩的工作原理大致如下:
所以'无损'转换会想避免尽可能多地做 - 特别是DCT量化以外的任何事情,但这并不能避免扩展数据。