コンテキスト

コンテキスト

同じでなければならない2つの画像を作成しましたが、そのバイナリは異なります。

$ 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

それはおそらくメタデータに含まれているタイムスタンプのためです。

質問:ImageMagickに常に同じバイナリファイルを生成させる方法は?


コンテキスト

私は多くの画像を生成し、それをGitに保存する大規模なImageMagickスクリプトを持っています(ほとんどの開発者はスクリプトを実行するために必要な環境がないためです)。

私はしばしばスクリプトを編集(たとえば、新しい画像を定義)し、それを実行してすべての画像を再生成します。しかし、私は変更されていない画像に対してGit diffをしたくありません。

明らかに、いくつかの圧縮アルゴリズムは、アーキテクチャによって若干異なる結果を生成する。常に同じマシンでビルドするので、これは大きな問題ではありません。ただし、同じコンピュータでもファイルは常に異なります。

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

答え1

-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

答え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 

編集する:

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

または(2番目の形式、テストして自分に適した形式を選択)

$ 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

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

答え3

変換オプションは-define png:exclude-chunks=date,time期待どおりに機能し、常に「ImageMagick 6.8.9-9 Q16 x86_64 2018-11-11」()に同じターゲットバイナリを生成しますconvert -v

関連情報