ImageMagick - Создание анимированного GIF-изображения из мозаичного изображения, возникли проблемы с метаданными «виртуального холста»

ImageMagick - Создание анимированного GIF-изображения из мозаичного изображения, возникли проблемы с метаданными «виртуального холста»

У меня есть изображение, содержащее более мелкие изображения, подобные этому:

------
| 1  |
------
| 2  |
------
| 3  |
------
| 4  |
------

Каждое подизображение имеет размер 100x200, а полное изображение — 100x800.

Я хотел бы объединить их все в одну анимацию, которая будет циклически показывать изображения с 1 по 4.

Я использую инструмент imagemagick convertдля обрезки изображений. Например, я сделал пакетный файл

convert %1 -crop 100x200+0+0 %~n1_01.png
convert %1 -crop 100x200+0+200 %~n1_02.png
convert %1 -crop 100x200+0+400 %~n1_03.png
convert %1 -crop 100x200+0+600 %~n1_04.png

А затем запустите его на образе под названиемmain.jpg

Это создает набор изображений, но когда я пытаюсь преобразовать их в gif, вот так

convert *.png out.gif

Вместо одной анимации размером 100x200 я получаю анимацию размером 100x800, а изображения просто появляются с определенными смещениями.

Когда я identifyобрезаю пару изображений, это дает мне

main_01.png PNG 100x200 100x800+0+0 8-bit sRGB 4.74KB 0.000u 0:00.000
main_02.png PNG 100x200 100x800+0+200 8-bit sRGB 3.39KB 0.000u 0:00.000

Вероятно, imagemagick пытается помочь, считывая метаданные и определяя, что я на самом деле хотел бы использовать холст 100x800, и каждое изображение должно быть размещено с определенными смещениями. Это не то, что мне нужно.

действительно, читаяруководство, imagemagick оставляет его там, чтобы помочь вам.

То есть IM сохраняет информацию о «виртуальном холсте», «странице» или «слоях» изображения, чтобы сохранить ее для дальнейшего использования. Это особенно важно для корректной работы обработки GIF-анимации.

Когда я вручную открываю каждый файл в Paint, а затем повторно сохраняю его, при повторной идентификации main_02.pngя получаю

main_02.png PNG 100x200 100x200+0+0 8-bit sRGB 4.03KB 0.000u 0:00.000

Проделав это со всеми изображениями, я снова преобразую их в gif-файл и в итоге получаю gif-файл размером 100x200, который выглядит так, как мне нужно.

Как мне установить все смещения на (0, 0), чтобы мне не пришлось делать это вручную через Paint?

решение1

Вы можете сбросить координаты виртуального холста, выполнив следующие действия +repageпосле обрезки:

convert %1 -crop 100x200+0+0 +repage %~n1_01.png
convert %1 -crop 100x200+0+200 +repage %~n1_02.png
convert %1 -crop 100x200+0+400 +repage %~n1_03.png
convert %1 -crop 100x200+0+600 +repage %~n1_04.png

Также вам не нужен пакетный файл для разделения изображения на плитки; если вы укажете только размер, оно будет разделено на плитки автоматически, используйте «%d» в имени выходного файла для номера плитки:

convert %1 -crop 100x200 +repage %~n1_%d.png

Или в вашем случае с двузначным числом фиксированной ширины:

convert %1 -crop 100x200 +repage %~n1_%02d.png

Это сгенерирует четыре изображения.

Фактически, вы также можете выполнить преобразование GIF в той же команде, без необходимости генерировать временные промежуточные файлы изображений вообще. Следующая команда сделает все, что вам нужно, одним махом:

convert %1 -crop 100x200 +repage out.gif

Для получения более подробной информации см.документация для-cropа также+repage(обратите внимание, что его -repageтакже можно использовать для редактирования данных виртуального холста в любом изображении).


Кстати, альтернативный способ разделения изображений — указатьчислоплиток вместо размера плиток; вы можете сделать это, указав размерв плиткахдля обрезки и добавления знака «@», например, это дает тот же результат, что и выше:

convert %1 -crop 1x4@ +repage %~n1_%02d.png

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