Crie o mesmo PNG com ImageMagick 2 vezes: Binários diferem

5

Eu crio duas imagens que devem ser idênticas, mas seus binários são diferentes:

$ 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

Provavelmente devido a um registro de data e hora em metadados incorporados.

PERGUNTA : Como fazer o ImageMagick criar um binário que será sempre o mesmo?

Contexto

Eu tenho um grande script do ImageMagick que cria muitas imagens que são salvas no Git (porque a maioria dos desenvolvedores não tem o ambiente necessário para executar o script).

Costumo editar o script (ex: definir uma nova imagem) e depois executá-lo para regenerar todas as imagens. Mas eu não quero ter diferenças no Git para imagens que não mudaram.

Aparentemente, alguns algoritmos de compactação produzem resultados ligeiramente diferentes em arquiteturas diferentes. Não é um grande problema, pois sempre gero na mesma máquina. Mas mesmo na mesma máquina, os arquivos sempre são diferentes.

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

    
por Nicolas Raoul 14.01.2016 / 09:27

2 respostas

5

Deve ser possível remover os timestamps usando -define png:exclude-chunks=date,time ; mas aparentemente há um erro no codificador PNG .

Se você puder organizar suas modificações, uma possibilidade seria usar a assinatura de identify para substituir apenas uma imagem existente se o conteúdo do pixel da imagem mudar:

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
    
por 14.01.2016 / 09:55
2

Você pode usar a opção -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 

EDITAR:

Pode haver algum bug no codificador png, portanto, se esse método não funcionar, tente um destes:

A opção +set remove uma informação específica no arquivo gerado. Aqui, removemos as datas de criação e modificação.

$ 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

ou (segundo formulário, teste para escolher o que funciona para você)

$ 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

fonte: link

    
por 14.01.2016 / 09:39