我希望以可重现的方式将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解码的所有参数?或者是否有一种替代解码器可以保证始终产生相同的像素值?
答案 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