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

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

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

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

sudo apt-get install imagemagick

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

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

Чтобы завершить ответ @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|cat21-33-26_1.jpg21-33-26_10.jpg   // <--- this one21-33-26_2.jpg21-33-26_3.jpg21-33-26_4.jpg21-33-26_5.jpg21-33-26_6.jpg21-33-26_7.jpg21-33-26_8.jpg21-33-26_9.jpg21-33-28_1.jpg    // <--- should be here    21-33-28_2.jpg21-33-28_3.jpg...

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

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

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

решение ffmeg + тестовые данные

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

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

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=trueunzip opengl-rotating-triangle.zipcd 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

enter image description here

Важный ffmpeg варианты, которые я хочу выделить, следующие:

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

  • -framerate 60: предположим, что на входных изображениях 60 кадров в секунду, а на выходе те же кадры в секунду.

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

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

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

    С его помощью, identify out.gif говорит, что GIF содержит только 64 кадра.

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

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

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

ImageMagick против бенчмарка ffmpeg

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

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

/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.010out.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010out.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: значение, соответствующее 60 кадрам в секунду для ffmpeg. Не должно иметь значения для производительности конверсии, но я не хочу рисковать.

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

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

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

и для ffmpeg:

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

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

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

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

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

convert -resize 50% -delay 10 -loop 0 image_{0..99}.jpg output.gif

GIMP

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

sudo apt-get install gimp

Создание gif-файла

Из GIMP перейдите к Файл> - Открыть как слои чтобы открыть все png-файлы на их собственном слое.

Open as Layer

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

Set file type to GIF

Оттуда вы перейдете к параметрам экспорта GIF. Отметьте галочкой 'Как Анимация выберите опцию и установите необходимые параметры.

GIF export options

Чтобы изменить задержку между кадрами

Измените название слоев и укажите задержку в миллисекундах между скобками, например: (1500ms)

enter image description here

Для предварительного просмотра анимации перед экспортом

Нажмите меню "Фильтры", затем "Анимация", затем "Воспроизведение анимации".

Вы можете использовать программу 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

* Обратите внимание, что приведенный выше пример взят прямо из Примеры Магии изображений

Работает, хотя и очень требователен к памяти. Однако существует множество потенциальных обманщиков: How do I create an animated gif from still images (preferably with the command line)? - Ask Ubuntu How do I create an animated gif from still images (preferably with the command line)? - Ask Ubuntu command line - Convert thousands of .pngs to animated .gif, `convert` uses too much memory - Ask Ubuntu command line - How can I create a GIF out of a sequence of PNG files without the previous image appearing on the next frame? - Ask Ubuntu 12.04 - Loop terminal command for combining PNG to GIF animation - Ask Ubuntu image processing - How to convert a PNG strip to a GIF? - Ask Ubuntu