У меня есть много групп изображений 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
Спасибо @MarkSetchell — я обновил сообщение, включив в него отдельные ресурсы, фактический результат команды примера и пример ожидаемого результата.
В 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
(зеленый) должен быть выше движущегося красного.
Затем поменяйте порядок img4 и img2.
@ fmw42 МаркСетчелл прав. Анимированный img3.gif
должен находиться под зеленым img4.gif
, а не сверху. Я попробовал ваше предложение поменять порядок img4 и img2, но результат был тот же (img3.gif
неправильно сверху). Спасибо.
@Trae, я отредактировал свой ответ. Я считаю, что теперь изменение соответствует ожидаемому результату. Я добавил - Flatten после img2, чтобы сначала сгладить красный цвет, затем старый - Flatten сгладит зеленый цвет поверх красного.
@Trae Странно, это было там когда-то. Возможно, я забыл его сохранить. Я снова поменял. Должно быть две команды - Flatten. Посмотрите еще раз.
Странно, что оригинал не работал. - Flatten должен привести изображения в порядок. Но я попробовал это, и это не сработало. Поэтому я добавил сглаживание после каждой пары изображений.
@fmw42 Спасибо. С помощью самой последней команды это результат x.gif
, который я получаю в Ubuntu с помощью ImageMagick 6.9.10-23 Q16 x86_6
: i.imgur.com/trh3Wfp.gif
@Trae Я бы посоветовал тебе обновиться. В этой версии наверняка есть ошибка. (Я полагаю, вы изменили магию, чтобы преобразовать, верно?)
@Trae Я только что попробовал с 6.9.13-14, и все работает нормально. Вы можете попробовать портативную версию под названием Magick на imagemagick.org/script/download.php, если ваша версия является последней из вашего дистрибутива Ubuntu. (К сожалению, я не могу установить вашу версию. Она слишком старая для моих делегатов)
@fmw42 Спасибо. Он находится на общем хостинге, и я не могу его обновить, но я рассмотрю рекомендованную вами автономную версию.
Вы можете попробовать последнюю версию Марка Сетчелла. Возможно, вы захотите поместить img3 в конец, чтобы зеленый цвет не накладывался на красный квадрат.
Спасибо. Однако обязательным является наложение зеленого цвета на красный квадрат.
@Trae Если вы хотите, чтобы зеленый цвет был больше красного, см. мои изменения в моем ответе, где я добавил новый код и вывод. Если это все еще не работает для вас, попробуйте подход Марка Сетчелла.
@fmw42 Спасибо. Мне удалось установить IM 7.0.10-43
локально, и ваше последнее обновление работает отлично. Я очень ценю помощь. Я назначу награду завтра, как только мне позволят.
Я бы сделал это так, потому что у 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.
Интересный подход - спасибо. Не все мои анимации имеют одинаковое количество кадров. Есть ли способ поддерживать переменное/динамическое количество кадров?
У меня сейчас работает последнее решение fwm42, и я пометил его как принятый ответ. Еще раз спасибо за альтернативный подход.
Пожалуйста, прочтите минимальный воспроизводимый пример , а затем нажмите редактировать и обновите свой вопрос, добавив в него GIF-файлы (анимированные и статические) и указав ожидаемый результат.