3

我刚刚从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:
我不打算实现自己的编解码器/算法。相反,我问是否有任何满足我的要求的实现。或者至少理论上可以。

4

1 回答 1

5

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

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

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

但这将是内存密集型的。

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

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

因此,“无损”转换将希望尽可能避免这样做——尤其是 DCT 量化之外的任何事情,但这并不能避免扩展数据。

于 2012-12-06T23:17:01.833 回答