Jak utworzyć animowany gif ze zdjęć (najlepiej z linii poleceń)?

78

Chcę zrobić .gifanimowany obraz z danego zestawu .jpgzdjęć.

Wolałbym to zrobić z wiersza poleceń, więc narzędzia wiersza poleceń byłyby bardzo mile widziane.

Maythux
źródło

Odpowiedzi:

87

Możesz użyć pakietu ImageMagick . Zainstaluj go za pomocą polecenia:

sudo apt-get install imagemagick

Teraz możesz utworzyć gifz liczby zdjęć ( jpg), używając:

convert -delay 20 -loop 0 *.jpg myimage.gif
Maythux
źródło
6
Podaj tutaj, w jaki sposób zmienisz rozmiar animacji gif itp. O 50%. Itd -resize 50%.
Léo Léopold Hertz -
Ubuntu 18.10 nie powiodło się z „wyczerpanymi zasobami pamięci podręcznej” dla tych obrazów: github.com/cirosantilli/media/blob/master/… powiązane: superuser.com/questions/1178666/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
ImageMagick użytkownicy będą prawdopodobnie również chcieć: -deconstruct. Odkryłem także, że pamięć ImageMagick jest bardzo głodny, zobacz odniesienia: askubuntu.com/a/1102183/52975
Ciro Santilli新疆改造中心法轮功六四事件
convert -delay 0 -loop 0 *.tif myanimated.gifdziałało ładnie, na 720 plikach tif
ron
46

Aby wypełnić odpowiedź @Maythux:

Aby uniknąć generowania bardzo dużego pliku, możesz użyć -resizeopcji:

W moim przypadku mam 4608x3456 obrazów, a wygenerowany gif był większy niż 300M dla 32 obrazów

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

lub

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

Zadbaj o * .jpg

*.jpg trochę do bani w przypadku wartości liczbowych, możesz wygenerować gif z nieposortowanymi zdjęciami.

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

Ponieważ strzały zostały zrobione bardzo szybko (10 / s), wszystkie mają ten sam czas modyfikacji i nie można ls -tna przykład oszukać . Na Ubuntu możesz ls -vzamiast tego użyć czegoś takiego:

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

Sortowanie numeryczne jest jednak dość trudne w systemie Mac OS X. Myślę, że musisz zbudować własny skrypt.

Ninsuo
źródło
4
Możesz uniknąć problemu * .jpg, przesyłając liczby dopełniające zerami. „01.jpg” zamiast „1.jpg” i tak dalej. Jeśli dojdziesz do potrójnych cyfr, to „001.jpg”, „010.jpg” itp.
bigreddmachine
2
Istnieje kilka sposobów rozwiązania problemu sekwencji nazw plików. W tym find, sortrozwijanie nawiasów i tak dalej. lsNarzędzie jest notorycznie nie nadają się do tego typu rzeczy. Użyj find. Jest trochę krzywej uczenia się, ale warto.
głosy
Niektórzy użytkownicy mogą być zainteresowani edycją nazw plików za pomocą massren: github.com/laurent22/massren
Graham P Heath
ukończenie zajmuje wieki. Czy istnieje pełna opcja?
ouranos
21

Nie mam wystarczającej reputacji, aby komentować, ale zamiast modyfikować nazwy plików, możesz użyć globowania, aby zachęcić powłokę do rozwijania nazw plików

convert -resize 50% -delay 10 -loop 0 image_{0..99}.jpg output.gif
Shanksk
źródło
11

ŻYŁKA

Możesz to łatwo zrobić za pomocą GIMP. Najpierw zainstaluj go, jeśli nie jest jeszcze zainstalowany

sudo apt-get install gimp

Tworzenie gif

Z GIMP przejdź do Plik -> Otwórz jako warstwy, aby otworzyć wszystkie pliki PNG na ich własnej warstwie.

Otwórz jako warstwę

Stąd możesz edytować warstwy i po zakończeniu przejść do Plik -> Eksportuj jako . W oknie dialogowym ustaw typ pliku na GIF.

Ustaw typ pliku na GIF

Stamtąd przejdziesz do opcji eksportu GIF. Zaznacz opcję „ Jako animacja ” i ustaw parametry zgodnie z wymaganiami.

Opcje eksportu GIF

chesedo
źródło
7

rozwiązanie ffmeg + dane testowe

Począwszy od Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8, zauważyłem, że ffmpeg jest znacznie szybszy i zużywa znacznie mniej pamięci .

Najprostszym poleceniem konwersji jest:

ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i '*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.gif \
;

Możesz pobrać moje dane testowe za pomocą:

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

Dane testowe zostały wygenerowane za pomocą: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292 i zawiera 256 1024x1024 obrazów PNG.

A oto kolejne dane testowe, które możesz teraz wygenerować bezpośrednio w przeglądarce! https://stackoverflow.com/questions/19235286/convert-html5-canvas-sequence-to-a-video-file/57153718#57153718

wprowadź opis zdjęcia tutaj

Ważne ffmpegopcje, które chcę podkreślić, to:

  • -pattern_type glob: wygodny sposób wybierania zdjęć

  • -framerate 60: załóż 60 klatek na sekundę na obrazach wejściowych i wyślij ten sam klatkę na sekundę.

    ffmpeg nie mogę wiedzieć inaczej, ponieważ nie ma danych FPS w obrazach, tak jak w formatach wideo.

    256 klatek wejściowych trwa około 4 sekund.

    -r 15: opcjonalny. Wybierz jeden co 4 obrazy, więc zmniejsz rozmiar ( 4 == 60 / 15).

    Dzięki niemu identify out.gifmówi, że GIF zawiera tylko 64 ramki.

    Nadal trwa to 4 sekundy, więc opóźnienie jest zmieniane, aby dopasować.

  • -vf scale=512:-1: opcjonalny. Ustaw szerokość, wysokość proporcjonalnie, zwykle w celu zmniejszenia rozmiaru i zaoszczędzenia miejsca.

Aby ImageMagick działał, najpierw musiałem zmodyfikować jego limity dysku i pamięci, /etc/ImageMagick-6/policy.xmljak wyjaśniono na stronie : https://superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages

Zobacz też:

Test porównawczy ImageMagick vs ffmpeg

Porównałem polecenia:

/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 \
;

Komendy zostały zbudowane tak, aby uzyskać wyniki możliwie jak najbliższe, aby porównanie było ważne:

  • /usr/bin/time -v: służy do znalezienia maksymalnego wykorzystania pamięci, jak wyjaśniono na stronie : https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process

  • -deconstruct: Obrazy GIF mogą zawierać tylko minimalny zmodyfikowany prostokąt z poprzedniej ramki, aby zmniejszyć GIF.

    ffmpegdomyślnie oblicza te różnice, ale ImageMagick nie, chyba że -deconstructzostanie użyty.

    Zasadniczo będziesz chciał skorzystać z tej opcji za każdym razem z ImageMagick.

    Różnicę możemy zaobserwować za pomocą:

    identify out.gif
    

    W wersji skompresowanej wszystkie ramki mają mniejsze rozmiary niż początkowa, np .:

    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
    

    W tym przykładzie druga klatka jest tylko 516x516zamiast pełnej 1024x1024 i jest ustawiona z przesunięciem o 252+257. Dlatego zawiera tylko środkowy trójkąt.

    Zobacz także: jak zmienić rozmiar animowanego pliku GIF za pomocą ImageMagick?

  • -delay: wartość odpowiadająca 60 FPS z ffmpeg. Nie powinno to mieć znaczenia dla wydajności konwersji, ale nie chcę ryzykować.

Wyjściowe pliki GIF mają mniej więcej ten sam rozmiar i wyglądają identycznie.

Dostajemy dla ImageMagick:

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

i dla ffmpeg:

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

z którego widzimy, że:

  • ImageMagick zużył 2,6 GB pamięci RAM i zajął około 1 minuty
  • ffmpeg zużył 100 MB pamięci RAM i zajął 4 sekundy

Sprzęt testowy: laptop Lenovo ThinkPad P51 , Intel Core i7-7820HQ, 32 GB (16 + 16) DDR4 2400 MHz SODIMM, 512 GB SSD PCIe TLC OPAL2.

Ciro Santilli
źródło
Pozytywne i lubiane! Świetna odpowiedź, mam jedno małe pytanie uzupełniające. Nie mam zbyt wielu obrazów wysokiej jakości i nie używałem -r i -vpoleceń, ale wyjściowy gif jest znacznie niższej jakości niż oryginalne pliki png. Jak zachować taką samą jakość gif jak podane pliki png?
astro123
Cześć @ astro123. Jaka jest niższa jakość? Mniejszy rozmiar obrazu, mniej klatek lub coś innego (GIF używa najwyraźniej bezstratnie, więc nie może być gorszej kompresji)? Spróbować -framerate 60 -r 60. Sprawdź wygenerowany plik GIF i obrazy wejściowe za pomocą narzędzi ImageMagick, takich jak identifypróba ustalenia , co się dzieje.
Ciro Santilli 10 改造 中心 法轮功 六四 事件
4

Możesz użyć programu o nazwie konwersja zawartego w pakiecie imagemagick. Jest sterowany z wiersza poleceń, ale bardzo łatwy w użyciu. Zainstaluj go za pośrednictwem centrum oprogramowania lub przejdź do wiersza polecenia i wpisz

sudo apt-get install imagemagick

Teraz, aby utworzyć .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

* Uwaga: powyższy przykład pochodzi bezpośrednio z przykładów magii obrazu

Scott Goodgame
źródło
1
Jak zrobić 40 obrazów PNG w zapętlonym pliku GIF? Wszystko w folderze / home / fusion809 / Documents / Images
BH2017
1
@ BH2017: convert -delay 20 -loop 0 *.png out.giftworzy zapętlony plik GIF.
unutbu