%3F.png)
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,time
que era necesario. Excluir sólo la date
porción no fue suficiente.
Esa opción única también era suficiente; No necesitaba -strip
exportar 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.