Как создать анимированный GIF из неподвижных изображений (желательно с командной строкой)?

78

Я хочу сделать .gifанимированные картинки из заданного набора .jpgкартинок.

Я бы предпочел сделать это из командной строки, поэтому инструменты командной строки будут очень кстати.

Maythux
источник

Ответы:

88

Вы можете использовать пакет ImageMagick . Установите его с помощью команды:

sudo apt-get install imagemagick

Теперь вы можете создать gifиз числа картинок ( jpg) используя:

convert -delay 20 -loop 0 *.jpg myimage.gif
Maythux
источник
6
Пожалуйста, укажите здесь, как вы изменяете размер анимации и т.д. на 50%. Etc -resize 50%.
Лео Леопольд Герц 준영
В Ubuntu 18.10 произошел сбой с использованием «ресурсов кеша» для этих изображений: github.com/cirosantilli/media/blob/master/… related: superuser.com/questions/1178666/…
Ciro Santilli San 新疆 中 23 法轮功 六四 事件 六四
Пользователи ImageMagick, вероятно , также хотят: -deconstruct. Я также обнаружил, что ImageMagick очень требователен к
Сиро Сантилли 23 事件 中 at 法轮功 六四 事件
convert -delay 0 -loop 0 *.tif myanimated.gifработал хорошо, на 720 файлов TIF
Рон
46

Чтобы завершить ответ @Maythux:

Чтобы избежать создания очень большого файла, вы можете использовать -resizeопцию:

В моем случае у меня есть 4608x3456 изображений, и сгенерированный GIF был больше, чем 300M для 32 изображений

convert -resize 20% -delay 20 -loop 0 *.jpg myimage.gif

или же

convert -resize 768x576 -delay 20 -loop 0 *.jpg myimage.gif

Позаботься о * .jpg

*.jpg Немного отстой при работе с числовыми значениями, вы можете сгенерировать GIF с несортированными фото.

$ ls|cat
21-33-26_1.jpg
21-33-26_10.jpg   // <--- this one
21-33-26_2.jpg
21-33-26_3.jpg
21-33-26_4.jpg
21-33-26_5.jpg
21-33-26_6.jpg
21-33-26_7.jpg
21-33-26_8.jpg
21-33-26_9.jpg
21-33-28_1.jpg    // <--- should be here    
21-33-28_2.jpg
21-33-28_3.jpg
...

Поскольку снимки были сделаны очень быстро (10 / с), все они имеют одинаковое время модификации, и вы не можете использовать трюк, ls -tнапример. В Ubuntu вы можете использовать ls -vвместо этого что-то вроде:

convert -resize 768x576 -delay 20 -loop 0 `ls -v` myimage.gif

Числовая сортировка довольно сложна в Mac OS X, хотя, я думаю, вам нужно будет создать собственный скрипт.

Ninsuo
источник
4
Вы можете избежать проблемы * .jpg, добавив числа с нулями. «01.jpg» вместо «1.jpg» и так далее. Если вы получите трехзначные цифры, то «001.jpg», «010.jpg» и т. Д.
bigreddmachine
2
Есть несколько способов обойти проблему последовательности имен файлов. В том числе find, sortрасширение скобки и так далее. lsИнструмент , как известно , непригодный для такого рода вещи. Используйте find. Есть немного кривой обучения, но оно того стоит.
голоса
Некоторые пользователи могут быть заинтересованы в редактировании имен файлов с помощью massren: github.com/laurent22/massren
Грэм P Heath
требуется целая вечность, чтобы закончить. Есть ли подробный вариант?
Уран
21

У меня недостаточно репутации, чтобы комментировать, но вместо изменения имен файлов вы можете использовать глобирование, чтобы ваша оболочка расширяла имена файлов

convert -resize 50% -delay 10 -loop 0 image_{0..99}.jpg output.gif
shanksk
источник
11

GIMP

Вы можете легко сделать это с GIMP. Сначала установите его, если он еще не установлен с

sudo apt-get install gimp

Создание GIF

Из GIMP перейдите в File -> Open as Layers, чтобы открыть все png на их собственном слое.

Открыть как слой

Отсюда вы можете выполнить редактирование слоев и, как только закончите, перейдите в File -> Export As . В диалоговом окне обязательно укажите тип файла GIF.

Установите тип файла в GIF

Оттуда вы перейдете к параметрам экспорта GIF. Отметьте опцию « As Animation » и установите необходимые параметры.

Параметры экспорта GIF

chesedo
источник
7

решение ffmeg + данные испытаний

Начиная с Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8, я обнаружил, что ffmpeg намного быстрее и использует гораздо меньше памяти .

Самая простая команда преобразования:

ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i '*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.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

Данные теста были созданы с: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292 и содержат 256 изображений PNG 1024x1024.

А вот и другие тестовые данные, которые вы можете генерировать прямо в своем браузере прямо сейчас! https://stackoverflow.com/questions/19235286/convert-html5-canvas-sequence-to-a-video-file/57153718#57153718

введите описание изображения здесь

Важные ffmpegпараметры, которые я хочу выделить:

  • -pattern_type glob: удобный способ выбора изображений

  • -framerate 60: примите 60 FPS на входных изображениях и выведите тот же FPS.

    ffmpeg иначе не может знать, поскольку в изображениях нет данных FPS, как в видеоформатах.

    Для 256 входных кадров требуется около 4 секунд.

    -r 15: по желанию. Выберите одно каждые 4 изображения, чтобы уменьшить размер ( 4 == 60 / 15).

    При этом identify out.gifговорится, что GIF содержит только 64 кадра.

    Игра все еще занимает 4 секунды, поэтому задержка изменяется, чтобы все совпадало.

  • -vf scale=512:-1: по желанию. Установите ширину, высоту шкалы пропорционально, обычно для уменьшения размера и экономии места.

Чтобы заставить ImageMagick работать, мне сначала пришлось изменить пределы диска и памяти, /etc/ImageMagick-6/policy.xmlкак описано по адресу: https://superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages

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

Тест ImageMagick vs ffmpeg

Я сравнил команды:

/usr/bin/time -v convert *.png -deconstruct -delay 1.6 out-convert.gif
/usr/bin/time -v ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i '*.png' \
  out-ffmpeg.gif \
;

Команды были созданы для получения выходных данных, максимально близких к действительному сравнению:

  • /usr/bin/time -v: используется для определения максимального использования памяти, как описано по адресу: https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process

  • -deconstruct: Изображения GIF могут содержать только минимальный измененный прямоугольник из предыдущего кадра, чтобы уменьшить размер GIF.

    ffmpegвычисляет эти различия по умолчанию, но ImageMagick не делает, если -deconstructне используется.

    Вы будете в основном хотеть использовать эту опцию каждый раз с ImageMagick.

    Мы можем наблюдать разницу с:

    identify out.gif
    

    В сжатой версии все кадры имеют меньшие размеры, чем исходный, например:

    out.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    out.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    out.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    

    В этом примере второй кадр только 516x516вместо полных 1024x1024 и размещен со смещением 252+257. Поэтому он содержит только средний треугольник.

    См. Также: как изменить размер анимированного GIF-файла с помощью ImageMagick?

  • -delay: значение, которое соответствует 60FPS of ffmpeg. Не должно иметь значения для эффективности конверсии, но я не хочу рисковать.

Выходные GIF-файлы имеют примерно одинаковый размер и выглядят визуально идентичными.

Мы получаем для ImageMagick:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:56.16
Maximum resident set size (kbytes): 2676856

и для ffmpeg:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.41
Maximum resident set size (kbytes): 97172

из которого мы видим, что:

  • ImageMagick использовал 2,6 ГБ оперативной памяти и занял около 1 минуты
  • ffmpeg использовал 100 МБ оперативной памяти и занял 4 секунды

Тестовое оборудование: ноутбук Lenovo ThinkPad P51 , Intel Core i7-7820HQ, 32 ГБ (16 + 16) DDR4 2400 МГц SODIMM, 512 ГБ SSD PCIe TLC OPAL2.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
Проголосовал и понравился !, отличный ответ, у меня есть еще один маленький вопрос. У меня не так много качественных изображений, и я не использовал -r и -vкоманды, тем не менее, выходной GIF имеет гораздо более низкое качество, чем оригинальные файлы PNG. Как сохранить то же качество gif, что и для файлов png?
astro123
Привет @ astro123 как качество ниже? Меньший размер изображения, или меньше кадров, или что-то еще (GIF, по-видимому, использует без потерь, так что не может быть хуже сжатия)? Попробуй -framerate 60 -r 60. Проверяйте сгенерированный GIF и вводите изображения с помощью инструментов ImageMagick, например, identifyчтобы попытаться выяснить, что происходит.
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
4

Вы можете использовать программу под названием convert, включенную в пакет imagemagick. Это командная строка, но очень проста в использовании. Установите его либо через центр программного обеспечения, либо перейдите в командную строку и введите

sudo apt-get install imagemagick

Теперь, чтобы создать .gif.

convert -delay 100  -size 100x100 xc:SkyBlue \
          -page +5+10  balloon.gif   -page +35+30 medical.gif  \
          -page +62+50 present.gif   -page +10+55 shading.gif  \
          -loop 0  animation.gif

* Обратите внимание, что приведенный выше пример взят из примеров Image Magick.

Скотт Гудгейм
источник
1
Как мне сделать 40 изображений PNG в цикле GIF? Все в папке / home / fusion809 / Документы / Изображения
BH2017
1
@ BH2017: convert -delay 20 -loop 0 *.png out.gifделает цикл GIF.
unutbu