%3F.png)
Я пытаюсь использовать 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 показывает, что файлы идентичны.