¿Cómo uso ImageMagick convert de manera reproducible (sin marcas de tiempo)?

¿Cómo uso ImageMagick convert de manera reproducible (sin marcas de tiempo)?

Estoy intentando utilizar ImageMagick en un script para convertir y cambiar el tamaño de una gran cantidad de archivos para el control de versiones. Necesito que los archivos se conviertan al mismo tiempo cada vez para que git no confirme archivos que acaban de tener marcas de tiempo actualizadas. Desafortunadamente, ImageMagick insiste en agregar una marca de tiempo de creación y modificación a cada imagen que hace que git vuelva a confirmar cada archivo.

He buscado mucho sobre este problema y he probado las siguientes opciones:

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

Ninguno de estos ha dado como resultado un proceso reproducible:

-definir png:excluir-fragmentos=fecha

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

+fijar fecha:crear +fijar fecha: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

-banda

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

¿Cómo puedo lograr conversiones reproducibles con ImageMagick?

Respuesta1

Debe actualizar ImageMagick a la versión 6.9.1-3 o superior, y luego todos los comandos de su pregunta crearán imágenes reproducibles.

Encontré lo siguiente enel registro de cambios:

2015-04-20 6.9.1-3 Cristy <quetzlzacatenango@image...>
  * Soporte -define compose:clamp=false opción (referencia
    https://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=26946).
  * No extienda ningún búfer de imagen proporcionado por el usuario en SeekBlob() (informe de error
    de a.chernij@corp...).
  * Construcciones reproducibles mejoradas (referencia
    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=783933).
  * Dibuja un rectángulo de ancho y alto de 1 (referencia
    https://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=24874).

Encontré la entrada del registro de cambios después de descubrir que ImageMagick en ArchLinux funciona bien, al contrario de ImageMagick en Ubuntu 16.04.

ArchLinux (buenas imágenes reproducibles):

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

Ubuntu 16.04 (imágenes malas y diferentes cada vez):

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

Respuesta2

Encontré -define png:exclude-chunks=date,timeque era necesario. Excluir sólo la dateporción no fue suficiente.

Esa opción única también era suficiente; No necesitaba -stripexportar una marca de tiempo específica SOURCE_DATE_EPOCH(que se ha sugerido en otro lugar).

Finalmente, para ver la diferencia diff <(xxd 1.png) <(xxd 2.png), mi forma preferida era ver tanto binario como ascii (útil para ver el ID del fragmento y dónde aparece la marca de tiempo).

Como referencia, solo excluyendo date:

8,9c8,9
< 00000070: 0000 0774 494d 4507 e503 030a 1d0f bd0c  ...tIME.........
< 00000080: 01f4 0000 8000 4944 4154 78da ecdd 7578  ......IDATx...ux
---
> 00000070: 0000 0774 494d 4507 e503 030a 1c19 50c3  ...tIME.......P.
> 00000080: 85e4 0000 8000 4944 4154 78da ecdd 7578  ......IDATx...ux

Respuesta3

Dejé de intentar que ImageMagick se comportara y recurrí al uso de GraphicsMagick, que parece tener todas las características de ImageMagick, menos este error de marca de tiempo:

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

Identificar muestra 2 marcas de tiempo diferentes, pero las obtiene de las propiedades del archivo en lugar de los metadatos incrustados, y diff/cmp muestra los archivos como idénticos.

información relacionada