ImageMagick: объедините несколько статических статичных изображений со случайно размещенным анимированным изображением и сохраните анимацию

У меня есть много групп изображений gif, и в каждой группе одно из изображений представляет собой анимированный gif. Я использую ImageMagick 6.9.10-23 Q16 x86_6 в Ubuntu 20.04 с PHP 8.2.12.

Для каждой группы я хочу взять изображения и объединить их в один gif, сохранив анимацию gif любого слоя изображения, полученного из анимированного gif. Слой анимированного изображения не находится в одной и той же позиции в каждой группе, и каждая анимация имеет разное количество кадров.

Команда в этом примере правильно объединяет изображения в один статический gif.

convert img1.gif img2.gif img3.gif img4.gif -coalesce -gravity center -background none -compose over -layers merge -layers optimize final.gif

Знаете ли вы, как я могу добиться результата, изображенного на expected.gif ниже? Спасибо.

Примеры активов

img1.gif

img2.gif

img3.gif

img4.gif

final.gif

expected.gif

Пожалуйста, прочтите минимальный воспроизводимый пример , а затем нажмите редактировать и обновите свой вопрос, добавив в него GIF-файлы (анимированные и статические) и указав ожидаемый результат.

Mark Setchell 09.08.2024 20:49

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

Trae 09.08.2024 21:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В Imagemagick вам нужно использовать композицию -layers, чтобы объединить их следующим образом (в синтаксисе Unix), но сначала сведите img1, img2, img4 в одно изображение. Обратите внимание на оператор NULL:, который разделяет сглаженное изображение и анимированное изображение.

magick \
\( img1.gif img2.gif -flatten img4.gif -flatten \) \
NULL: \
\( img3.gif -coalesce \) \
-compose over -layers composite x.gif

В Windows удалите \ из круглых скобок и замените символ конца строки \ на ^.

См. https://imagemagick.org/Usage/anim_mods/#composite

Если вы хотите зеленый вместо красного, попробуйте

convert \
\( img1.gif img2.gif -flatten \) \
NULL: \
\( img3.gif -coalesce \) \
-compose over -layers composite \
NULL: \
img4.gif -compose over -layers composite y.gif

Кажется, это работает для меня.

Очень близко, но я думаю, что img4.gif (зеленый) должен быть выше движущегося красного.

Mark Setchell 10.08.2024 19:19

Затем поменяйте порядок img4 и img2.

fmw42 10.08.2024 20:10

@ fmw42 МаркСетчелл прав. Анимированный img3.gif должен находиться под зеленым img4.gif, а не сверху. Я попробовал ваше предложение поменять порядок img4 и img2, но результат был тот же (img3.gif неправильно сверху). Спасибо.

Trae 11.08.2024 17:00

@Trae, я отредактировал свой ответ. Я считаю, что теперь изменение соответствует ожидаемому результату. Я добавил - Flatten после img2, чтобы сначала сгладить красный цвет, затем старый - Flatten сгладит зеленый цвет поверх красного.

fmw42 11.08.2024 18:09

@Trae Странно, это было там когда-то. Возможно, я забыл его сохранить. Я снова поменял. Должно быть две команды - Flatten. Посмотрите еще раз.

fmw42 11.08.2024 20:24

Странно, что оригинал не работал. - Flatten должен привести изображения в порядок. Но я попробовал это, и это не сработало. Поэтому я добавил сглаживание после каждой пары изображений.

fmw42 11.08.2024 20:25

@fmw42 Спасибо. С помощью самой последней команды это результат x.gif, который я получаю в Ubuntu с помощью ImageMagick 6.9.10-23 Q16 x86_6: i.imgur.com/trh3Wfp.gif

Trae 11.08.2024 21:29

@Trae Я бы посоветовал тебе обновиться. В этой версии наверняка есть ошибка. (Я полагаю, вы изменили магию, чтобы преобразовать, верно?)

fmw42 11.08.2024 22:10

@Trae Я только что попробовал с 6.9.13-14, и все работает нормально. Вы можете попробовать портативную версию под названием Magick на imagemagick.org/script/download.php, если ваша версия является последней из вашего дистрибутива Ubuntu. (К сожалению, я не могу установить вашу версию. Она слишком старая для моих делегатов)

fmw42 11.08.2024 22:14

@fmw42 Спасибо. Он находится на общем хостинге, и я не могу его обновить, но я рассмотрю рекомендованную вами автономную версию.

Trae 12.08.2024 01:31

Вы можете попробовать последнюю версию Марка Сетчелла. Возможно, вы захотите поместить img3 в конец, чтобы зеленый цвет не накладывался на красный квадрат.

fmw42 12.08.2024 01:44

Спасибо. Однако обязательным является наложение зеленого цвета на красный квадрат.

Trae 12.08.2024 01:45

@Trae Если вы хотите, чтобы зеленый цвет был больше красного, см. мои изменения в моем ответе, где я добавил новый код и вывод. Если это все еще не работает для вас, попробуйте подход Марка Сетчелла.

fmw42 12.08.2024 02:20

@fmw42 Спасибо. Мне удалось установить IM 7.0.10-43 локально, и ваше последнее обновление работает отлично. Я очень ценю помощь. Я назначу награду завтра, как только мне позволят.

Trae 12.08.2024 04:03

Я бы сделал это так, потому что у img3.gif 5 кадров:

for ((f=0;f<5;f++)) ; do
   magick img1.gif img2.gif img3.gif[$f] img4.gif -flatten miff:-
done | magick -loop 0 miff:- anim.gif

Это ставит зеленый цвет над красным квадратом. Это то, что спрашивают? Он также читает img1, img2 и im4 5 раз, по одному разу для каждого кадра img3.

fmw42 12.08.2024 01:00

Интересный подход - спасибо. Не все мои анимации имеют одинаковое количество кадров. Есть ли способ поддерживать переменное/динамическое количество кадров?

Trae 12.08.2024 01:30

У меня сейчас работает последнее решение fwm42, и я пометил его как принятый ответ. Еще раз спасибо за альтернативный подход.

Trae 12.08.2024 04:05

Другие вопросы по теме