Как использовать ImageMagick convert воспроизводимым образом (без временных меток)?

Как использовать ImageMagick convert воспроизводимым образом (без временных меток)?

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

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

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

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

-define png:exclude-chunks=дата

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

-полоска

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?

решение1

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

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

2015-04-20 6.9.1-3 Кристи <quetzlzacatenango@image...>
  * Поддержка опции -define compose:clamp=false (ссылка
    https://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=26946).
  * Не расширяйте предоставленный пользователем буфер изображений в SeekBlob() (отчет об ошибке
    от a.chernij@corp...).
  * Улучшенные воспроизводимые сборки (ссылка)
    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=783933).
  * Нарисуйте прямоугольник шириной и высотой 1 (ссылка
    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

решение2

Я нашел, -define png:exclude-chunks=date,timeчто это необходимо. Исключить только dateкусок было недостаточно.

Этих отдельных опций также было достаточно; мне не нужно было -stripэкспортировать определенную временную метку SOURCE_DATE_EPOCH(что предлагалось в другом месте).

Наконец, для просмотра разницы diff <(xxd 1.png) <(xxd 2.png)я выбрал способ просмотра как двоичного, так и ASCII-файла (полезно видеть идентификатор фрагмента и место появления временной метки).

Для справки, за исключением 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

решение3

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

Связанный контент