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.


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

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.


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

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


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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.