web-dev-qa-db-ja.com

ImageMagickで同じPNGを2回作成します:バイナリが異なります

同一であるはずの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

おそらく、埋め込まれたメタデータのタイムスタンプが原因です。

[〜#〜] question [〜#〜]:ImageMagickに常に同じになるバイナリを作成させる方法は?


環境

多くの画像を作成してGitに保存する大きなImageMagickスクリプトがあります(ほとんどの開発者はスクリプトを実行するために必要な環境を持っていないため)。

私はよくスクリプトを編集し(例:新しい画像を定義)、それを実行してすべての画像を再生成します。ただし、変更されていない画像のGitの違いは必要ありません。

どうやら、いくつかの圧縮アルゴリズムは、異なるアーキテクチャでわずかに異なる結果を生成します。私はいつも同じマシンで生成するので、大きな問題ではありません。ただし、同じマシン上でも、ファイルは常にすべて異なります。

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

5
Nicolas Raoul

-define png:exclude-chunks=date,time;を使用して、タイムスタンプを削除できるはずです。しかし、どうやら PNGエンコーダーのバグ があります。

変更をステージングできる場合、1つの可能性は、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
5
Stephen Kitt

-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

2
Mathieu

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

0
Gerrit Griebel