可再现的像素完美 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
我想以可重现的方式将 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
.
最后的命令是
convert src.jpeg \
-define jpeg:dct-method=islow
-set colorspace RGB -colorspace RGB \
-compress none dest.ppm