Я хочу сделать анимированное изображение .gif
из заданного набора of .jpg
картинки.
Я бы предпочел делать это из командной строки, поэтому инструменты командной строки будут очень приветствоваться.
Вы можете использовать пакет ImageMagick . Установите его с помощью команды:
sudo apt-get install imagemagick
Теперь вы можете создать gif
из количества изображений ( jpg
), используя:
convert -delay 20 -loop 0 *.jpg myimage.gif
Чтобы завершить ответ @Maythux:
-resize
: В моем случае у меня 4608x3456 изображений и сгенерированного gif было больше 300 МБ для 32 изображений
convert -resize 20% -delay 20 -loop 0 *.jpg myimage.gif
или
convert -resize 768x576 -delay 20 -loop 0 *.jpg myimage.gif
*. jpg
немного отстой при работе с числовыми значениями, вы можете создать gif с несортированными pics.
$ 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, хотя, думаю, вам нужно будет создать собственный сценарий.
решение 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=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 vs ffmpeg benchmark
Чтобы получить Чтобы 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 могут содержать только минимум imal изменил прямоугольник из предыдущего кадра, чтобы уменьшить размер GIF.
ffmpeg
вычисляет эти различия по умолчанию, но ImageMagick не делает этого, если не используется -deconstruct
.
В основном вы захотите использовать эту опцию каждый раз с ImageMagick.
Мы можем наблюдать разницу с помощью:
identify out.gif
В сжатой версии все кадры имеют меньший размер, чем исходный, например :[1280 sizesout.gif[0] GIF 1024x1024 1024x1024 + 0 + 0 8-битный sRGB 256c 16,7865MiB 0,010u 0: 00,010 out.gif [1] GIF 516x516 1024x1024 + 252 + 257 8-битный sRGB 256c 16,7865MiB 0,010u 0: 00.010 out.gif [2] GIF 515x520 1024x1024 + 248 + 257 8-битный sRGB 256c 16,7865MiB 0,010u 0: 00.010
В этом примере размер второго кадра составляет только 516x516
вместо полного 1024x1024, и он размещен со смещением 252 + 257
. Поэтому он содержит только средний треугольник.
См. Также: как изменить размер анимированного файла GIF с помощью ImageMagick?
-delay
: значение, которое соответствует 60FPS 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
] из которого мы видим, что:
Тестовое оборудование: Lenovo ThinkPad P51 ноутбук , Intel Core i7-7820HQ, 32 ГБ (16 + 16) DDR4 SODIMM 2400 МГц, 512 ГБ SSD PCIe TLC OPAL2.
Вы можете использовать программу 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 Examples
Вы можете легко сделать это с помощью GIMP. Сначала установите его, если он еще не установлен с помощью
sudo apt-get install gimp
Из GIMP перейдите в Файл -> Открыть как слои , чтобы открыть все png на отдельном слое.
Отсюда вы можете редактировать слои и после этого перейти к Файл -> Экспортировать как . В диалоговом окне обязательно установите тип файла GIF.
Оттуда вы перейдете к параметрам экспорта GIF. Отметьте опцию « As Animation » и установите требуемые параметры.
Измените название слоев и укажите задержку в миллисекундах между скобками, как это : (1500 мс)
Щелкните меню «Фильтры», затем «Анимация», затем «Воспроизведение анимации».
У меня недостаточно репутации, чтобы комментировать, но вместо изменения имен файлов вы можете использовать подстановку, чтобы ваша оболочка расширяла имена файлов
convert -resize 50% -delay 10 -loop 0 image_{0..99}.jpg output.gif