jpeg无损转换 - 内存消耗?

时间:2012-12-06 22:59:32

标签: memory jpeg codec imaging libjpeg-turbo

我刚从http://jpegclub.org/jpegtran/下载了最新的win32 jpegtran.exe 并观察了以下内容:

我准备了一张24 BPP jpeg测试图像,图像为14500 x 10000像素。

  • 文件系统中的压缩大小约为 7.5 MB
  • 解压缩到内存(带有一些图像查看器)膨胀到 450 MB

在无损旋转期间监视jpegtran.exe命令行工具的内存消耗(180)我可以看到该进程消耗最多 900 MB 内存!

我会假设这样的 jpeg无损转换不需要将图像文件解码到内存中,而只是对编码文件本身执行一些数学转换 - 保持内存占用非常低。

以下哪项是真的?

  • 此特定工具实施中的一些错误
  • 我错过了一些配置开关
  • 我的一些误解(即jpeg无损转换还需要将图像解码到内存中?)
  • “数学运算”比“将图像解码为内存”消耗的内存更多

修改

根据JasonD的回答,原因似乎是后者。所以我会延伸我的问题:

是否有任何实现可以在小块中执行 (以避免高内存使用)?或者它总是需要在整体上完成而且没有办法解决它?

PS:
我不打算实现自己的编解码器/算法。相反,我问是否有任何实现符合我的要求。或者至少在理论上是否存在。

1 个答案:

答案 0 :(得分:5)

我不知道有问题的库,但是为了在jpeg图像上执行无损旋转,你至少必须解压缩DCT系数才能旋转它们,然后重新压缩。 / p>

完全展开的DCT系数与原始图像数据的大小相同或更大,因为它们具有更多的信息位。

它是无损的,因为jpeg中的丢失是由DCT系数的量化引起的。只要您不对这些进行解码/重新编码/重新量化,就不会产生任何损失。

但它会占用大量内存。

jpeg压缩的工作原理大致如下:

  • 将图像转换为YCbCr色彩空间。
  • 可选地对一些通道进行下采样(颜色误差比亮度误差更不易察觉,因此通常对色度通道进行2倍下采样)。这显然是有损的,但非常可预测/稳定地如此。
  • 通过离散余弦变换(DCT)变换图像的8x8块,将图像移动到频率空间。 DCT系数也是8x8块,并且比8位图像数据使用更多位进行存储。
  • 按可变量量化DCT系数(这是大多数包中的质量设置)。目的是产生尽可能多的小系数,尤其是零系数。这是jpeg压缩的主要“有损”方面。
  • 通过2D数据进行Z字形化,将其转换为大致按频率顺序排列的1D系数流。高频更有可能被淘汰,因此很多数据包最终会以零的流结束,这可能会被截断。
  • 使用huffman编码压缩(非损耗)(现在非常可压缩)数据。

所以'无损'转换会想避免尽可能多地做 - 特别是DCT量化以外的任何事情,但这并不能避免扩展数据。

相关问题