Como uso o ImageMagick convert de uma forma reproduzível (sem timestamps)?

3

Estou tentando usar o ImageMagick em um script para converter e redimensionar um grande número de arquivos para controle de versão. Eu preciso dos arquivos para converter o mesmo tempo toda vez que o git não confirmar arquivos que acabaram de ser atualizados. Infelizmente, o ImageMagick insiste em adicionar um registro de data e hora de criação e modificação a cada imagem que faz o git recomeminar todos os arquivos novamente.

Pesquisei bastante sobre esse problema e tentei os seguintes sinalizadores:

-define png:exclude-chunks=date
+set date:create +set date:modify
-strip

Nenhum deles resultou em um processo reproduzível:

-define png: exclude-chunks = date

stephen@Saturn ~/test (git)-[master] % convert input.png -define png:exclude-chunks=date -resize 100x100 1.png
stephen@Saturn ~/test (git)-[master] % convert input.png -define png:exclude-chunks=date -resize 100x100 2.png
stephen@Saturn ~/test (git)-[master] % diff 1.png 2.png
Binary files 1.png and 2.png differ
stephen@Saturn ~/test (git)-[master] % cmp -l 1.png 2.png
  125  41  42
  126  67   0
  127 322 101
  128 321 101
  129  35 353
  130  64 370

+ definir data: criar + definir data: modificar

stephen@Saturn ~/test (git)-[master] % convert input.png +set date:create +set date:modify -resize 100x100 1.png
stephen@Saturn ~/test (git)-[master] % convert input.png +set date:create +set date:modify -resize 100x100 2.png
stephen@Saturn ~/test (git)-[master] % diff 1.png 2.png
Binary files 1.png and 2.png differ
stephen@Saturn ~/test (git)-[master] % cmp -l 1.png 2.png
  125  51  52
  126  71   0
  127 375 211
  128 260 230
  129 272 141
  130  73 360

-strip

stephen@Saturn ~/test (git)-[master] % convert input.png -strip -resize 100x100 1.png
stephen@Saturn ~/test (git)-[master] % convert input.png -strip -resize 100x100 2.png
stephen@Saturn ~/test (git)-[master] % diff 1.png 2.png
Binary files 1.png and 2.png differ
stephen@Saturn ~/test (git)-[master] % cmp -l 1.png 2.png
  110  41  45
  111 241 246
  112 235 360
  113 264 160
  114 252 263

Como posso realizar conversões reproduzíveis com o ImageMagick?

    
por Stephen Smith 17.05.2016 / 18:48

2 respostas

2

Você precisa atualizar o ImageMagick para a versão 6.9.1-3 ou superior e, em seguida, todos os comandos da sua pergunta criarão imagens reproduzíveis.

Encontrei o seguinte em o changelog :

2015-04-20  6.9.1-3 Cristy  <quetzlzacatenango@image...>
  * Support -define compose:clamp=false option (reference
    https://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=26946).
  * Don't extend any user supplied image buffer in SeekBlob() (bug report
    from a.chernij@corp...).
  * Improved reproducible builds (reference
    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=783933).
  * Draw a rectangle of width & height of 1 (reference
    https://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=24874).

Encontrei a entrada do changelog depois de descobrir que o ImageMagick no ArchLinux funciona bem, ao contrário do ImageMagick no Ubuntu 16.04.

ArchLinux (imagens boas e reproduzíveis):

$ convert --version
Version: ImageMagick 6.9.8-8 Q16 x86_64 2017-05-30 http://www.imagemagick.org

Ubuntu 16.04 (imagens ruins e diferentes toda vez):

$ convert --version
Version: ImageMagick 6.8.9-9 Q16 x86_64 2017-05-26 http://www.imagemagick.org
    
por 19.06.2017 / 13:23
1

Eu desisti de fazer com que o ImageMagick se comportasse, e recorri ao uso do GraphicsMagick, que parece ter todos os recursos do ImageMagick, menos esse erro de timestamp:

stephen@Saturn ~/test (git)-[master] % gm convert -resize 100x100 input.png 1.png
stephen@Saturn ~/test (git)-[master] % gm convert -resize 100x100 input.png 2.png
stephen@Saturn ~/test (git)-[master] % diff 1.png 2.png
stephen@Saturn ~/test (git)-[master] % cmp -l 1.png 2.png

Identify mostra dois timestamps diferentes, mas está obtendo a partir das propriedades do arquivo em vez dos metadados incorporados, e o diff / cmp mostra os arquivos como sendo idênticos.

    
por 18.05.2016 / 15:18