Я хочу сделать .gif
анимированное изображение из заданного набора .jpg
картинки.
Я бы предпочел сделать это из командной строки, поэтому инструменты командной строки были бы очень кстати.
Я хочу сделать .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
немного отстой, когда имеешь дело с числовыми значениями, вы можете сгенерировать 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
Важный 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
из которого мы видим, что:
Тестовое оборудование: 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. Сначала установите его, если он еще не установлен с помощью
sudo apt-get install gimp
Из GIMP перейдите к Файл> - Открыть как слои чтобы открыть все png-файлы на их собственном слое.
Отсюда вы можете выполнить редактирование слоев и, как только закончите, перейти к Файл> - Экспорт В Виде. В диалоговом окне обязательно установите тип файла на GIF.
Оттуда вы перейдете к параметрам экспорта GIF. Отметьте галочкой 'Как Анимация выберите опцию и установите необходимые параметры.
Измените название слоев и укажите задержку в миллисекундах между скобками, например: (1500ms)
Нажмите меню "Фильтры", затем "Анимация", затем "Воспроизведение анимации".
Вы можете использовать программу 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