可再现的像素完美 JPEG 解码

Reproducible pixel perfect JPEG decoding

我想以可重现的方式将 JPEG 文件转换为 PPM 文件,这样某个 JPEG 文件将始终转换为相同的 PPM 文件,而不管转换在哪台计算机上 运行。

做一个简单的

convert -compress none src.jpeg dest.ppm

根据安装的 imagemagick 版本不同,PPM 文件会略有不同。我想不同的版本使用不同的默认值。

这个问题可以在 Ubuntu 12.04 盒子和 Ubuntu 14.04 盒子上转换图像,然后将两个 PPM 与 compare -compose src img1.ppm img2.ppm 进行比较。

有没有办法指定所有影响JPEG解码的参数?或者是否有保证始终产生相同像素值的替代解码器?

正如评论所暗示的,这里有两个问题需要解决。 DCT 量化和色彩空间。

DCT 的默认选择使用依赖于机器的浮点代码,这可能会导致小的变化。这可以使用选择基于整数的精确 DCT 的选项 -define jpeg:dct-method=islow 来解决。

对颜色空间的支持在过去的版本中发生了很大变化,因此很难立即获得可重现的结果。一般来说,做到这一点是一个问题,但就我而言,只要它们在任何地方都相同,我就可以避免产生不忠实的颜色。这可以通过强制 imagemagick 将源数据解释为线性 RGB 并始终使用命令 -set colorspace RGB -colorspace RGB.

生成线性 RGB 来实现。

最后的命令是

convert src.jpeg \
    -define jpeg:dct-method=islow
    -set colorspace RGB -colorspace RGB \
    -compress none dest.ppm