Ich möchte ein .gif
animiertes Bild aus einem bestimmten Satz von .jpg
Bildern erstellen.
Ich würde es vorziehen, es von der Kommandozeile aus zu tun, daher wären Kommandozeilen-Tools sehr willkommen.
Ich möchte ein .gif
animiertes Bild aus einem bestimmten Satz von .jpg
Bildern erstellen.
Ich würde es vorziehen, es von der Kommandozeile aus zu tun, daher wären Kommandozeilen-Tools sehr willkommen.
Antworten:
Sie können das ImageMagick- Paket verwenden. Installieren Sie es mit dem Befehl:
sudo apt-get install imagemagick
Jetzt können Sie gif
aus der Anzahl der Bilder ( jpg
) eine erstellen, indem Sie Folgendes verwenden:
convert -delay 20 -loop 0 *.jpg myimage.gif
-resize 50%
.
-deconstruct
. Ich habe auch festgestellt, dass ImageMagick sehr speicherhungrig ist, siehe Benchmarks: askubuntu.com/a/1102183/52975
convert -delay 0 -loop 0 *.tif myanimated.gif
schön gearbeitet, auf 720 tif - Dateien
So vervollständigen Sie die @ Maythux-Antwort:
-resize
Option 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
*.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 -t
zum Beispiel nicht mit Tricks umgehen . Auf Ubuntu können Sie ls -v
stattdessen 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.
find
, sort
Klammererweiterung und so weiter. Das ls
Tool ist für diese Art von Dingen bekanntermaßen ungeeignet. Verwenden Sie find
. Es gibt eine gewisse Lernkurve, aber es lohnt sich.
Mit GIMP ist dies problemlos möglich. Installieren Sie es zuerst, wenn es noch nicht mit installiert wurde
sudo apt-get install gimp
Von GIMP aus gehen Sie zu Datei -> Als Ebenen öffnen, um alle PNGs auf ihrer eigenen Ebene zu öffnen.
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.
Von dort aus gelangen Sie zu den GIF-Exportoptionen. Aktivieren Sie die Option " Als Animation " und stellen Sie die Parameter nach Bedarf ein.
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
Die wichtigen ffmpeg
Optionen, 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.gif
dass 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.xml
wie 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.
ffmpeg
berechnet diese Unterschiede standardmäßig, ImageMagick jedoch nicht, es -deconstruct
sei 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 516x516
anstelle 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:
Testhardware : Lenovo ThinkPad P51 Laptop , Intel Core i7-7820HQ, 32 GB (16 + 16) DDR4 2400 MHz SODIMM, 512 GB SSD PCIe TLC OPAL2.
-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?
-framerate 60 -r 60
. Untersuchen Sie das generierte GIF und geben Sie Bilder mit den ImageMagick-Tools ein identify
, um herauszufinden, was gerade passiert .
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
convert -delay 20 -loop 0 *.png out.gif
eine GIF-Schleife.