jpeg无损转换 - 内存消耗?

Opm*_*met 3 memory jpeg imaging codec 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:
我不打算实现自己的编解码器/算法.相反,我问是否有任何实现符合我的要求.或者至少在理论上是否存在.

Jas*_*onD 5

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

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

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

但它将是内存密集型的.

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

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

因此,"无损"转换会希望避免尽可能多地做 - 尤其是除了DCT量化之外的任何事情,但这并不能避免扩展数据.