3

Я пытаюсь использовать ImageMagick в сценарии для преобразования и изменения размера большого количества файлов для контроля версий. Мне нужно, чтобы файлы каждый раз конвертировались в одно и то же время, чтобы git не фиксировал файлы, которые только что обновили метки времени. К сожалению, ImageMagick настаивает на добавлении метки времени создания и изменения к каждому изображению, что заставляет git повторно фиксировать каждый файл снова.

Я много искал об этой проблеме, и я попробовал следующие флаги:

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

Ни один из них не привел к воспроизводимому процессу:

-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

+ установить дату: создать + установить дату: изменить

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

Как я могу выполнить воспроизводимые преобразования с помощью ImageMagick?

2 ответа2

2

Вам необходимо обновить ImageMagick до версии 6.9.1-3 или выше, и тогда все команды из вашего вопроса создадут воспроизводимые изображения.

В журнале изменений я нашел следующее:

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).

Я нашел запись в журнале изменений, обнаружив, что ImageMagick в ArchLinux работает отлично, в отличие от ImageMagick в Ubuntu 16.04.

ArchLinux (хорошие, воспроизводимые изображения):

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

Ubuntu 16.04 (плохо, каждый раз разные картинки):

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

Я отказался от того, чтобы заставить ImageMagick вести себя, и я прибег к использованию GraphicsMagick, которая, похоже, обладает всеми функциями ImageMagick, за исключением этой ошибки отметки времени:

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 показывает две разные метки времени, но получает их из свойств файла вместо встроенных метаданных, а diff / cmp показывает, что файлы идентичны.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .