使用 ImageMagick 创建相同的 PNG 2 次:二进制文件不同

Nic*_*oul 5 version-control imagemagick binary png

我创建了两个应该相同的图像,但它们的二进制文件不同:

$ convert -size 1x1 xc:white out1/w.png
$ sleep 1
$ convert -size 1x1 xc:white out2/w.png
$ diff out1/w.png out2/w.png 
Binary files out1/w.png and out2/w.png differ
Run Code Online (Sandbox Code Playgroud)

可能是因为嵌入元数据中的时间戳。

问题:如何让 ImageMagick 创建一个始终相同的二进制文件?


语境

我有一个很大的 ImageMagick 脚本,它创建了许多图像,然后将这些图像保存到 Git(因为大多数开发人员没有运行脚本所需的环境)。

我经常编辑脚本(例如:定义一个新图像)然后运行它来重新生成所有图像。但我不想对没有改变的图像有 Git 差异。

显然,一些压缩算法在不同的架构上产生的结果略有不同。不是大问题,因为我总是在同一台机器上生成。但即使在同一台机器上,文件也总是不同的。

ImageMagick 6.8.9-9 Q16 x86_64 2015-08-06,在 Ubuntu 2015.10 上

Ste*_*itt 5

应该可以使用-define png:exclude-chunks=date,time; 但显然PNG 编码器中存在一个错误

如果您可以进行修改,一种可能性是使用identify的签名仅在图像的像素内容更改时替换现有图像:

mkdir out
convert -size 1x1 xc:white out/w.png
if [ ! -f w.png ]; then
    mv out/w.png w.png
else
    if [ "$(identify -verbose w.png | awk '/ignature/ { print $2 }')" != "$(identify -verbose out/w.png | awk '/ignature/ { print $2 }')" ]; then
        mv out/w.png w.png
    else
        rm out/w.png
    fi
fi
Run Code Online (Sandbox Code Playgroud)


Mat*_*ieu 2

您可以使用以下 -strip选项:

$ convert -strip -size 1x1 xc:white out1/w.png
$ convert -strip -size 1x1 xc:white out2/w.png
$ md5sum out1/w.png out2/w.png 
<...same data...> *out1/w.png 
<...same data...> *out2/w.png 
Run Code Online (Sandbox Code Playgroud)

编辑:

png-encoder 中可能存在一些错误,因此如果此方法不起作用,请尝试以下方法之一:

+set选项删除生成文件中的特定信息。在这里,我们删除创建和修改日期。

$ convert +set date:create +set date:modify -size 1x1 xc:white out1/w.png
$ convert +set date:create +set date:modify -size 1x1 xc:white out2/w.png
Run Code Online (Sandbox Code Playgroud)

或(第二种形式,测试以选择适合您的形式)

$ convert +set date:create +set modify-date -size 1x1 xc:white out1/w.png
$ convert +set date:create +set create-date -size 1x1 xc:white out2/w.png
Run Code Online (Sandbox Code Playgroud)

来源: http: //www.imagemagick.org/script/command-line-options.php