Chcę zrobić .gif
animowany obraz z danego zestawu .jpg
zdjęć.
Wolałbym to zrobić z wiersza poleceń, więc narzędzia wiersza poleceń byłyby bardzo mile widziane.
Chcę zrobić .gif
animowany obraz z danego zestawu .jpg
zdjęć.
Wolałbym to zrobić z wiersza poleceń, więc narzędzia wiersza poleceń byłyby bardzo mile widziane.
Odpowiedzi:
Możesz użyć pakietu ImageMagick . Zainstaluj go za pomocą polecenia:
sudo apt-get install imagemagick
Teraz możesz utworzyć gif
z liczby zdjęć ( jpg
), używając:
convert -delay 20 -loop 0 *.jpg myimage.gif
-resize 50%
.
-deconstruct
. Odkryłem także, że pamięć ImageMagick jest bardzo głodny, zobacz odniesienia: askubuntu.com/a/1102183/52975
convert -delay 0 -loop 0 *.tif myanimated.gif
działało ładnie, na 720 plikach tif
Aby wypełnić odpowiedź @Maythux:
-resize
opcji: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
*.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 -t
na przykład oszukać . Na Ubuntu możesz ls -v
zamiast 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.
find
, sort
rozwijanie nawiasów i tak dalej. ls
Narzędzie jest notorycznie nie nadają się do tego typu rzeczy. Użyj find
. Jest trochę krzywej uczenia się, ale warto.
Możesz to łatwo zrobić za pomocą GIMP. Najpierw zainstaluj go, jeśli nie jest jeszcze zainstalowany
sudo apt-get install gimp
Z GIMP przejdź do Plik -> Otwórz jako warstwy, aby otworzyć wszystkie pliki PNG na ich własnej warstwie.
Stąd możesz edytować warstwy i po zakończeniu przejść do Plik -> Eksportuj jako . W oknie dialogowym ustaw typ pliku na GIF.
Stamtąd przejdziesz do opcji eksportu GIF. Zaznacz opcję „ Jako animacja ” i ustaw parametry zgodnie z wymaganiami.
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
Ważne ffmpeg
opcje, 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.gif
mó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.xml
jak 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.
ffmpeg
domyślnie oblicza te różnice, ale ImageMagick nie, chyba że -deconstruct
zostanie 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 516x516
zamiast 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:
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.
-r
i -v
poleceń, ale wyjściowy gif jest znacznie niższej jakości niż oryginalne pliki png. Jak zachować taką samą jakość gif jak podane pliki png?
-framerate 60 -r 60
. Sprawdź wygenerowany plik GIF i obrazy wejściowe za pomocą narzędzi ImageMagick, takich jak identify
próba ustalenia , co się dzieje.
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
convert -delay 20 -loop 0 *.png out.gif
tworzy zapętlony plik GIF.