Вопрос или проблема
Существует ли инструмент для создания gif
анимации из набора png
файлов?
Я пробовал команду convert
из набора ImageMagick, но это не всегда удается. Также у меня есть несколько проблем с этим:
- Я не могу понять, какой прогресс.
- Независимо от того, что я пробую, флаг
-delay
не изменяет частоту кадров анимации gif. convert
определяет порядок кадров на основе алфавитного порядка названий файлов. Это означает, чтоname500.png
будет помещен сразу послеname50.png
, а не послеname450.png
. Я могу это исправить, добавив нули, но это раздражает.
Команда convert
из ImageMagick — это удобный инструмент командной строки для этого.
cd
в папку с вашими png-файлами и выполните эту команду:
magick -delay 10 -loop 0 *.png animation.gif
Новые версии ffmpeg не имеют -sameq (см. faq), но поддерживают GIF.
ffmpeg -i %03d.png output.gif
Где %03d — это ID кадра в 3 цифрах.
Вы также можете попробовать использовать ffmpeg
для создания фильма из последовательности изображений, а затем конвертировать фильм в анимацию GIF (снова используя ffmpeg
).
# см. http://pages.uoregon.edu/noeckel/MakeMovie.html
# сначала конвертируем последовательность изображений в фильм
ffmpeg -sameq -i %03d.jpg output.mp4
# ... а затем конвертируем фильм в анимацию GIF
ffmpeg -i output.mp4 -pix_fmt rgb24 -s qcif -loop_output 0 output.gif
Опция --delay
команды convert
применяется только к следующему изображению в командной строке. Поэтому convert -delay 10 *
установит задержку первого кадра только на 0.1 секунды. Опцию нужно повторить:
convert $(for a in *; do printf -- "-delay 10 %s " $a; done; ) result.gif
Для вашей потребности в сортировке convert
не сортирует кадры, это делает оболочка с помощью глобального шаблона *
. Если вы знаете, что ваши кадры пронумерованы от 0 до 700, вы можете просто вычислить номера сами:
convert $(for ((a=0; a<700; a++)); do printf -- "-delay 10 name%s.png " $a; done;) result.gif
Важные опции GIF ffmeg + тестовые данные
В дополнение к этому ответу:
wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
ffmpeg \
-framerate 60 \
-pattern_type glob \
-i 'tmp.*.png' \
-r 15 \
-vf scale=512:-1 \
out.gif \
;
Тестовые данные были сгенерированы с помощью: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292
Важные ffmpeg
опции, на которые я хотел бы обратить внимание:
-pattern_type glob
: удобный способ выбрать изображения-framerate 60
и-r 15
: предполагается 60 FPS для входящих изображений (ffmpeg
не может знать иначе, так как в изображениях нет данных о FPS, как в видеоформатах), выбираем одно из каждых 4 изображений, чтобы уменьшить размер (4 == 60 / 15
)-vf scale=512:-1
: установить ширину, пропорционально изменять высоту, обычно для уменьшения размера и экономии места
Смотрите также:
- Видео из изображений: https://stackoverflow.com/questions/24961127/how-to-create-a-video-from-images-with-ffmpeg/37478183#37478183)
- GIF из видео: https://askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line)
Протестировано на Ubuntu 18.10, ffmpeg 4.0.2.
Обновление:
Используйте convert
для png-в-gif, затем используйте gifsicle для анимации. Это не универсальное решение, но, несомненно, скриптируемое.
GIMP может создавать анимированные GIF и предоставляет управление таймингом/задержкой и повтором и т.д.
ImageMagick может создавать gif-анимацию хорошего качества. Посмотрите это видео – http://www.youtube.com/watch?v=OFusYizJ-bA
ffmpeg может сделать все за вас, но действительно трудно с этим разобраться. Я написал маленький скрипт, чтобы сделать работу, чтобы не помнить. Он проходит по изображениям дважды: передает “a”, чтобы определить оптимальную палитру цветов, затем передает “b”, чтобы фактически создать gif-файл, используя созданную палитру. Скопируйте следующее в текстовый файл:
#!/bin/bash
ffmpeg -framerate 24 -start_number_range 999 -f image2 -i $1%3d.png -filter_complex "[0:v] split [a][b];[a] palettegen [p];[b][p] paletteuse" $1.gif
Сохраните файл как “creategif” или что-то другое на ваш вкус, сделайте его исполняемым и поместите в ту же директорию, что и ваш набор png.
Для последовательности foobar004.png, foobar005.png, foobar006.png…
откройте командную строку и перейдите в директорию с всем этим, а затем введите
./creategif foobar
и он создаст файл foobar.gif из png. Вы можете добавить несколько параметров в скрипт, чтобы сделать его немного более гибким, но мне легче просто изменить скрипт, если я хочу другую частоту кадров или что-то подобное. Большое спасибо тому, кто указал мне верное направление несколько лет назад на этом форуме.
Чтобы получить кадры в числовом порядке (т.е. 1.png, 2.png), а не в алфавитном, сделайте это:
files=$(ls | sort --version-sort); convert -delay 10 -loop 0 $files animation.gif
Что касается пункта 2
Версия ImageMagick “display”, которую я имею (ImageMagick 6.7.2-7 2017-01-12), игнорирует частоту кадров, установленную с помощью команды convert для создания анимированного gif. Попробуйте другую программу для просмотра анимированного gif, например, firefox.
Ответ или решение
Создание GIF-анимации из PNG-файлов является распространенной задачей в мире графики и веб-разработки. Для этого существует несколько инструментов, среди которых наиболее популярными являются ImageMagick и ffmpeg. В данной статье мы подробно рассмотрим, как эффективно использовать эти инструменты, а также предоставим решения для часто встречающихся проблем.
Использование ImageMagick для создания анимации GIF
ImageMagick — это мощный инструмент командной строки для работы с графикой. Чтобы создать GIF-анимацию из PNG-файлов, выполните следующие шаги:
- Перейдите в папку с вашими PNG-файлами.
- Запустите следующую команду в терминале:
magick -delay 10 -loop 0 *.png animation.gif
В этой команде:
-delay 10
задает задержку между кадрами (в данном случае 10/100 секунды).-loop 0
указывает на бесконечное повторение GIF.
Проблемы с ImageMagick и их решения
Несмотря на универсальность ImageMagick, вы можете столкнуться с некоторыми проблемами, такими как:
-
Отсутствие визуального прогресса. ImageMagick не отображает процесс обработки. Для решения этой проблемы можно использовать
pv
(Pipe Viewer), чтобы отслеживать прогресс. -
Проблемы с задержкой. Опция
-delay
применяется только к следующему изображению. Чтобы задать одинаковую задержку для всех кадров, повторите флаг для каждого файла. Для автоматизации вы можете использовать следующую команду:convert $(for a in *.png; do printf -- "-delay 10 %s " "$a"; done) result.gif
-
Неправильный порядок кадров. ImageMagick сортирует изображения по алфавиту. Чтобы обеспечить правильный порядок, можете воспользоваться командой:
files=$(ls | sort --version-sort); convert -delay 10 -loop 0 $files animation.gif
Использование ffmpeg для создания GIF
ffmpeg — это еще один мощный инструмент для работы с видео и графикой. Для создания GIF-анимации из последовательности PNG-файлов выполните следующее:
-
Перейдите в директорию с изображениями и запустите:
ffmpeg -framerate 10 -i %03d.png output.gif
Здесь
%03d
— это пример формата имени файлов (например, 001.png, 002.png). -
Чтобы добиться лучшего качества и оптимизации размера GIF, используйте палитру:
ffmpeg -framerate 24 -i %03d.png -vf "palettegen" palette.png ffmpeg -framerate 24 -i %03d.png -i palette.png -lavfi "paletteuse" output.gif
Альтернативные инструменты
GIMP: Если вы предпочитаете графические интерфейсы, то GIMP предоставляет простые инструменты для создания анимации. Вы можете управлять временем задержки и циклом анимации, что делает его отличным выбором для пользователей, не знакомых с командной строкой.
Gifsicle: Для улучшения уже созданных GIF-файлов можно использовать gifsicle
, который позволяет оптимизировать и редактировать анимации.
Заключение
Создание GIF-анимаций из PNG-файлов является простой задачей при использовании подходящих инструментов. ImageMagick и ffmpeg предлагают широкие возможности для формирования качественной анимации, а также позволяют решать распространенные проблемы с порядком кадров и задержкой. Выбор инструмента зависит от ваших предпочтений и требований проекта. Применение вышеперечисленных методов поможет вам эффективно создать анимацию и улучшить ваш рабочий процесс.