Wie erstelle ich ein animiertes GIF aus Standbildern (vorzugsweise mit der Befehlszeile)?

78

Ich möchte ein .gifanimiertes Bild aus einem bestimmten Satz von .jpgBildern erstellen.

Ich würde es vorziehen, es von der Kommandozeile aus zu tun, daher wären Kommandozeilen-Tools sehr willkommen.

Maythux
quelle

Antworten:

87

Sie können das ImageMagick- Paket verwenden. Installieren Sie es mit dem Befehl:

sudo apt-get install imagemagick

Jetzt können Sie gifaus der Anzahl der Bilder ( jpg) eine erstellen, indem Sie Folgendes verwenden:

convert -delay 20 -loop 0 *.jpg myimage.gif
Maythux
quelle
6
Bitte geben Sie hier an, wie Sie die Größe der GIF-Animation usw. um 50% ändern. Etc -resize 50%.
Léo Léopold Hertz 준영
Ubuntu 18.10 mit "Cache - Ressourcen erschöpft" nicht bestanden für diese Bilder: github.com/cirosantilli/media/blob/master/... bezogen werden : superuser.com/questions/1178666/...
Ciro Santilli新疆改造中心法轮功六四事件
ImageMagick Nutzer wollen wahrscheinlich auch: -deconstruct. Ich habe auch festgestellt, dass ImageMagick sehr speicherhungrig ist, siehe Benchmarks: askubuntu.com/a/1102183/52975
Ciro Santilli Am
convert -delay 0 -loop 0 *.tif myanimated.gifschön gearbeitet, auf 720 tif - Dateien
ron
46

So vervollständigen Sie die @ Maythux-Antwort:

Um zu vermeiden, dass eine sehr große Datei generiert wird, können Sie die folgende -resizeOption verwenden:

In meinem Fall habe ich 4608 x 3456 Bilder und das generierte GIF war mehr als 300 MB für 32 Bilder

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

oder

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

Pass auf * .jpg auf

*.jpg Wenn Sie mit numerischen Werten arbeiten, kann es sein, dass Sie ein GIF mit unsortierten Bildern erstellen.

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

Da die Aufnahmen sehr schnell gemacht wurden (10 / s), haben sie alle die gleiche Änderungszeit und Sie können ls -tzum Beispiel nicht mit Tricks umgehen . Auf Ubuntu können Sie ls -vstattdessen Folgendes verwenden :

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

Das numerische Sortieren ist unter Mac OS X jedoch recht schwierig. Ich denke, Sie müssen ein benutzerdefiniertes Skript erstellen.

Ninsuo
quelle
4
Sie können Ihr * .jpg-Problem vermeiden, indem Sie Zahlen mit Nullen auffüllen. "01.jpg" anstelle von "1.jpg" und so weiter. Wenn Sie dreistellig sind, dann "001.jpg", "010.jpg" usw.
bigreddmachine
2
Es gibt verschiedene Möglichkeiten, das Problem mit der Dateinamenfolge zu umgehen. Einschließlich find, sortKlammererweiterung und so weiter. Das lsTool ist für diese Art von Dingen bekanntermaßen ungeeignet. Verwenden Sie find. Es gibt eine gewisse Lernkurve, aber es lohnt sich.
Stimmen
Einige Benutzer könnten daran interessiert sein, Dateinamen mit massren zu bearbeiten: github.com/laurent22/massren
Graham P Heath
es dauert ewig, bis es fertig ist. Gibt es eine ausführliche Option?
Ouranos
21

Ich habe nicht genug Reputation, um zu kommentieren, aber anstatt Dateinamen zu ändern, können Sie Globbing verwenden, um Ihre Shell zu veranlassen, Dateinamen zu erweitern

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

GIMP

Mit GIMP ist dies problemlos möglich. Installieren Sie es zuerst, wenn es noch nicht mit installiert wurde

sudo apt-get install gimp

Erstellen Sie das GIF

Von GIMP aus gehen Sie zu Datei -> Als Ebenen öffnen, um alle PNGs auf ihrer eigenen Ebene zu öffnen.

Öffne als Ebene

Von hier aus können Sie Änderungen an den Ebenen vornehmen und anschließend zu Datei -> Exportieren als wechseln . Stellen Sie im Dialogfeld sicher, dass der Dateityp auf GIF eingestellt ist.

Setzen Sie den Dateityp auf GIF

Von dort aus gelangen Sie zu den GIF-Exportoptionen. Aktivieren Sie die Option " Als Animation " und stellen Sie die Parameter nach Bedarf ein.

GIF-Exportoptionen

chesedo
quelle
7

ffmeg Lösung + Testdaten

Ab Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8 habe ich festgestellt, dass ffmpeg viel schneller ist und viel weniger Speicher benötigt .

Der einfachste Konvertierungsbefehl lautet:

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

Sie können meine Testdaten erhalten mit:

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

Die Testdaten wurden generiert mit: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292 und enthalten 256 PNG-Bilder im Format 1024x1024.

Und hier sind noch weitere Testdaten, die Sie jetzt direkt in Ihrem Browser generieren können! https://stackoverflow.com/questions/19235286/convert-html5-canvas-sequence-to-a-video-file/57153718#57153718

Bildbeschreibung hier eingeben

Die wichtigen ffmpegOptionen, die ich hervorheben möchte, sind:

  • -pattern_type glob: Bequeme Methode zum Auswählen von Bildern

  • -framerate 60: Nehmen Sie 60 FPS für Eingangsbilder an und geben Sie die gleichen FPS aus.

    ffmpeg kann nicht anders wissen, da es keine FPS-Daten in Bildern gibt, wie es in Videoformaten ist.

    Es dauert ungefähr 4 Sekunden, bis die 256 Eingangsrahmen fertig sind.

    -r 15: Optional. Wählen Sie alle 4 Bilder eines aus, um die Größe zu verringern ( 4 == 60 / 15).

    Damit heißt es, identify out.gifdass das GIF nur 64 Frames enthält.

    Es dauert immer noch 4 Sekunden, also wird die Verzögerung geändert, um eine Übereinstimmung zu erzielen.

  • -vf scale=512:-1: Optional. Stellen Sie die Breite und die Höhe proportional ein, um die Größe zu verringern und Platz zu sparen.

Um ImageMagick zum Laufen zu bringen, musste ich zuerst die Festplatten- und Speicherbeschränkungen /etc/ImageMagick-6/policy.xmlwie folgt ändern : https://superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages

Siehe auch:

ImageMagick vs ffmpeg Benchmark

Ich habe die Befehle verglichen:

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

Die Befehle wurden so konstruiert, dass sie möglichst nahe beieinander liegen, um den Vergleich gültig zu machen:

  • /usr/bin/time -v: wird verwendet, um die maximale Speichernutzung zu ermitteln, wie unter https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process erläutert

  • -deconstruct: GIF-Bilder können nur das minimal geänderte Rechteck aus dem vorherigen Frame enthalten, um das GIF zu verkleinern.

    ffmpegberechnet diese Unterschiede standardmäßig, ImageMagick jedoch nicht, es -deconstructsei denn, es wird verwendet.

    Grundsätzlich möchten Sie diese Option jedes Mal mit ImageMagick verwenden.

    Wir können den Unterschied beobachten mit:

    identify out.gif
    

    Bei der komprimierten Version sind alle Frames kleiner als die ursprüngliche, z. B .:

    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
    

    In diesem Beispiel ist der zweite Frame nur 516x516anstelle des vollen 1024x1024 und wird mit einem Versatz von platziert 252+257. Es enthält also nur das mittlere Dreieck.

    Siehe auch: Wie kann ich mit ImageMagick die Größe einer animierten GIF-Datei ändern?

  • -delay: Wert, der mit den 60 fps von übereinstimmt ffmpeg. Sollte für die Conversion-Leistung keine Rolle spielen, aber ich möchte es nicht riskieren.

Die ausgegebenen GIFs sind ungefähr gleich groß und sehen optisch identisch aus.

Wir bekommen für ImageMagick:

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

und für ffmpeg:

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

von dem wir sehen, dass:

  • ImageMagick benötigte 2,6 GB RAM und benötigte ungefähr 1 Minute
  • ffmpeg verbrauchte 100 MB RAM und benötigte 4 Sekunden

Testhardware : Lenovo ThinkPad P51 Laptop , Intel Core i7-7820HQ, 32 GB (16 + 16) DDR4 2400 MHz SODIMM, 512 GB SSD PCIe TLC OPAL2.

Ciro Santilli ist ein Schauspieler
quelle
Aufgestimmt und gemocht !, tolle Antwort, ich habe eine kleine Folgefrage. Ich habe nicht so viele qualitativ hochwertige Bilder, und ich habe keine Befehle -r und verwendet -v, dennoch ist das Ausgabe-GIF von viel geringerer Qualität als die ursprünglichen PNG-Dateien. Wie behalte ich die gleiche Qualität von GIF wie bei PNG-Dateien?
Astro123
Hallo @astro123 wie ist die Qualität geringer? Kleinere Bildgröße oder weniger Frames oder etwas anderes (GIF verwendet anscheinend verlustfrei, kann also keine schlechtere Komprimierung sein)? Versuchen Sie es -framerate 60 -r 60. Untersuchen Sie das generierte GIF und geben Sie Bilder mit den ImageMagick-Tools ein identify, um herauszufinden, was gerade passiert .
Ciro Santilli新疆改造中心法轮功六四事件
4

Sie können ein Programm namens convert verwenden, das im imagemagick-Paket enthalten ist. Es ist befehlszeilengesteuert, aber sehr einfach zu bedienen. Installieren Sie es entweder über das Software Center oder rufen Sie eine Eingabeaufforderung auf und geben Sie Folgendes ein

sudo apt-get install imagemagick

Nun erstellen Sie das 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

* Beachten Sie, dass das obige Beispiel direkt aus den Image Magick-Beispielen stammt

Scott Goodgame
quelle
1
Wie mache ich 40 PNG-Bilder in einem sich wiederholenden GIF? Alles im Ordner / home / fusion809 / Documents / Images
BH2017
1
@ BH2017: Erstellt convert -delay 20 -loop 0 *.png out.gifeine GIF-Schleife.
Unutbu