Як створити анімований gif з нерухомих зображень (бажано за допомогою командного рядка)?


78

Я хочу зробити .gifанімаційну картинку з заданого набору .jpgмалюнків.

Я вважаю за краще робити це з командного рядка, тому інструменти командного рядка були б дуже раді.


Відповіді:


87

Ви можете використовувати пакет ImageMagick . Встановіть його за допомогою команди:

sudo apt-get install imagemagick

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

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

6
Будь ласка, включіть сюди, як ви змінюєте розмір gif-анімації тощо на 50%. Etc -resize 50%.
Лео Леопольд Герц 준영

У Ubuntu 18.10 не вдалося вичерпати " кешові ресурси" для цих зображень: github.com/cirosantilli/media/blob/master/… пов’язано: superuser.com/questions/1178666/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Користувачі ImageMagick, ймовірно , також хочуть: -deconstruct. Я також з’ясував, що ImageMagick дуже голодний на пам’ять, дивіться орієнтири: askubuntu.com/a/1102183/52975
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

convert -delay 0 -loop 0 *.tif myanimated.gifдобре працював, на 720 файлах tif
ron

46

Щоб заповнити @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

*.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, хоча, я думаю, вам знадобиться створити спеціальний сценарій.


4
Ви можете уникнути проблеми * .jpg, переправивши додаткові номери з нулями. "01.jpg" замість "1.jpg" тощо. Якщо ви отримаєте тризначні цифри, то "001.jpg", "010.jpg" тощо
bigreddmachine

2
Проблема послідовності імен файлів існує декількома способами. У тому числі find, sortрозширення брекетів тощо. lsІнструмент , як відомо , непридатний для такого роду речі. Використовуйте find. Існує трохи кривої навчання, але воно того варте.
голоси

Деяким користувачам може бути цікаво редагувати файли файлів з масоном: github.com/laurent22/massren
Graham P Heath

потрібно закінчити віки. Чи є багатослівний варіант?
ouranos

21

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

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

11

GIMP

Ви можете легко зробити це за допомогою GIMP. Спочатку встановіть його, якщо він уже не встановлений

sudo apt-get install gimp

Створення gif

Від GIMP перейдіть до Файл -> Відкрити як шари, щоб відкрити всі PNG на власному шарі.

Відкрити як шар

Звідси ви можете виконувати правки на шарах і, виконавши їх, перейдіть до Файл -> Експорт як . У діалоговому вікні обов'язково встановіть тип файлу GIF.

Встановіть тип файлу в GIF

Звідти ви перейдете до варіантів експорту GIF. Поставте прапорець " Як анімація " та встановіть потрібні параметри.

Варіанти експорту GIF


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 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.


Отриманий і сподобався !, чудова відповідь, у мене є одне невелике подальше запитання. У мене не так багато високоякісних зображень, і я не використовував -r і -vкоманди, все ж вихідний gif має набагато нижчу якість, ніж оригінальні файли png. Як зберегти таку саму якість gif, як дані файлів png?
astro123

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

4

Ви можете використовувати програму з назвою перетворити, включену в пакет 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

* Зауважте, що наведений вище приклад прямо з зображень Magic Examples


1
Як зробити 40 зображень PNG у циклічному GIF? Все в папці / додому / fusion809 / Документи / Зображення
BH2017

1
@ BH2017: convert -delay 20 -loop 0 *.png out.gifробить циклічний GIF.
unutbu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.