可重复的像素完美JPEG解码

时间:2015-08-27 14:02:26

标签: imagemagick imagemagick-convert

我希望以可重现的方式将JPEG文件转换为PPM文件,以便某个JPEG文件始终转换为相同的PPM文件,无论运行转换的计算机如何。

做一个简单的

convert -compress none src.jpeg dest.ppm

将导致PPM文件略有不同,具体取决于安装的imagemagick版本。我想不同的版本会使用不同的默认值。

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

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

1 个答案:

答案 0 :(得分:1)

正如评论所暗示的,这里有两个问题需要解决。 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