동일해야 하는 두 개의 이미지를 만들었지만 해당 바이너리는 다릅니다.
$ 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
또는 (두 번째 형식, 테스트하여 자신에게 적합한 형식 선택)
$ 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
.