Создание GIF-анимации из файлов PNG


83

Есть ли инструмент для создания gifанимации из набора pngфайлов?

Я попробовал convertкоманду из набора ImageMagick , но это не всегда удается. Кроме того, у меня есть несколько проблем с этим:

  1. Я не могу сказать, каков прогресс.
  2. Независимо от того, что я пытаюсь, -delayфлаг не меняет частоту кадров анимации GIF.
  3. convertопределяет порядок кадров на основе алфавитного порядка имен файлов. Это означает, что name500.pngбудет размещено сразу после, name50.pngа не после того, как name450.pngя смогу это исправить, добавив 0, но это раздражает.

[Новости] Существует огромное совпадение между Ubuntu Stackexchange и Unix Stackexchange. Я попытался классифицировать некоторые темы здесь .
ххх

Что касается пункта 3., вы все равно можете использовать convertпосле сортировки файлов. Возможно, что-то вроде этого работаетfiles=$(ls name*png | sort -n -tname -k1); convert $files animation.gif
altroware

Для точки 1: преобразование имеет -monitorпараметр, который отслеживает процесс
Curlew

@hhc - вся категоризация - это просто ссылка на ответ с 5 ссылками; только один из них кажется связанным, но это всего лишь ссылка на вопрос выше. - Комментарий по @Luke дает простое решение: convert -delay 200 -loop 0 *.jpg output.gif.
Сиприкус

Ответы:


50

В новых версиях ffmpeg нет -sameq ( см. Faq ), но есть поддержка GIF.

ffmpeg -i %03d.png output.gif

Где% 03d - это идентификатор кадра из 3 цифр.

Вы также можете попробовать ffmpegсоздать фильм из последовательности изображений, а затем преобразовать фильм в GIF-анимацию (снова используя ffmpeg).

# cf. http://pages.uoregon.edu/noeckel/MakeMovie.html

# first convert an image sequence to a movie
ffmpeg -sameq -i %03d.jpg output.mp4

# ... and then convert the movie to a GIF animation
ffmpeg -i output.mp4 -pix_fmt rgb24 -s qcif -loop_output 0 output.gif

10
Эта инструкция устарела.
высокий уровень обслуживания

3
sameqВариант не доступен. Кроме того, для меня это переписывает исходные файлы изображений и не создает действительный файл фильма.
Lode

Какой смысл оставлять там -sameqкод? Почему вы хотите использовать формат видео с потерями ( output.mp4) как временный? И если да, то почему "то же качество", что и вход, а не очень высокий битрейт? Артефакты от этого только ухудшат GIF-кодировщик. Если вам нужно было использовать видео в качестве временного, вы бы хотели использовать что-то без потерь, как huffyuv. Или MJPEG без транскодирования, просто перепутайте входные JPEG в MJPEG. ( -codec:video copy).
Питер Кордес

80

convertэто удобный инструмент командной строки для этого cdв папку, содержащую ваши png- файлы и запустите эту команду:

convert -delay 10 -loop 0 *.png animation.gif

Источник: http://ubuntuforums.org/showthread.php?t=1132058


5
Вопрос упоминает convertи некоторые проблемы с его использованием. Ваш ответ не касается ни одного из них.
Мат

3
Начиная с версии ImageMagick 6.8.7-4 2013-11-02 Q16это работало для меня.
Руди Матела

7
Это работает, но 10означает 10 * 10 мс, так что довольно быстро. Задержка 100составляет 1 секунду.
Анн ван Россум

7
используйте опцию -dispose previousили -dispose 2если вы работаете с прозрачными PNG
Hải Phong

4
обратите внимание на себя: расширение фигурных скобок может быть полезно для указания списка изображений в качестве аргументов, например, pic_{0..20..2}.pngрасширения pic_0.png, pic_2.pngвплоть доpic_20.png
Yibo Yang

19

Опция convert's --delayприменяется только к следующему изображению в командной строке. Так convert -delay 10 *будет только установить задержку первого кадра на 0,1 секунды. Опцию нужно повторить:

convert $(for a in *; do printf -- "-delay 10 %s " $a; done; ) result.gif

Если вам нужна сортировка, конвертирование не сортирует фреймы, это происходит с помощью оболочки *. Если вы знаете, что ваши кадры пронумерованы от 0 до 700, вы можете просто вычислить числа самостоятельно:

convert $(for ((a=0; a<700; a++)); do printf -- "-delay 10 name%s.png " $a; done;) result.gif

5
Я не испытываю такого поведения с convert, для меня convert -delay 1000 -loop 0 *.png animation.gifдействительно добавляет задержку 10 с между каждым изображением.
Lode

1
Вы также можете использовать версию своего рода в lsкоманде. То есть:convert -delay 1000 $(ls -v name*png) output.gif
Эрик

7

Обновить:

Используйте convertдля png-to-gif, затем используйте gifsicle для анимации. Это не решение One App To Do It All, но, безусловно, с возможностью написания сценариев.


GIMP может создавать анимированные GIF-изображения и обеспечивает контроль времени / задержки и повтора и т. Д.


4
Я знаю о GIMP, но я не знаю, как его написать. Кроме того, использование gimp для создания анимации похоже на убийство мухи пушкой
Yotam

1
Это плохая идея; качество будет ужасным, так как каждый кадр будет квантоваться отдельно.
Климент

2

ImageMagick может генерировать анимацию хорошего качества. Проверьте это видео - http://www.youtube.com/watch?v=OFusYizJ-bA


6
Добро пожаловать в Unix и Linux! Как правило, нам нравятся ответы на сайте, чтобы они могли стоять сами по себе - Ссылки - это здорово, но если эта ссылка когда-либо разорвется, в ответе должно быть достаточно информации, чтобы она оставалась полезной. Пожалуйста, рассмотрите возможность редактирования своего ответа, чтобы включить больше деталей. Смотрите FAQ для получения дополнительной информации.
SLM

Какой полезный комментарий выше ....
Лука

1
convert -delay 200 -loop 0 *.jpg output.gif
Люк

@Luke - из всего того хаоса, который был опубликован под этим вопросом, твой комментарий был наиболее полезным
cipricus

2

ffmeg важные параметры GIF + данные испытаний

Чтобы дополнить этот ответ :

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параметры, которые я хотел бы выделить:

  • -patter_type glob: удобный способ выбора изображений
  • -framerate 60и -r 15: предположим, что 60 кадров в секунду на входных изображениях ( ffmpegиначе не может быть, так как в изображениях нет данных FPS, как в видеоформатах), выбирайте одно каждые 4 изображения, чтобы уменьшить размер ( 4 == 60 / 15)
  • -vf scale=512:-1: установите ширину, пропорционально высоту шкалы, обычно для уменьшения размера и экономии места

Смотрите также:

Протестировано в Ubuntu 18.10, ffmpeg 4.0.2.


-1

Что касается пункта 2

Версия ImageMagick «display», которую я имею (ImageMagick 6.7.2-7 2017-01-12), игнорирует частоту кадров, установленную с помощью команды convert, для создания анимированного GIF. Попробуйте другую программу для просмотра анимированного GIF, как Firefox.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.