Erstellen einer GIF-Animation aus PNG-Dateien


83

Gibt es ein Tool zum Erstellen einer gifAnimation aus einer Reihe von pngDateien?

Ich habe den convertBefehl aus der ImageMagick- Suite ausprobiert , aber das gelingt nicht immer. Ich habe auch einige Probleme damit:

  1. Ich kann nicht sagen, was der Fortschritt ist.
  2. Egal was ich versuche, die -delayFlagge ändert nicht die Framerate der GIF-Animation.
  3. convertbestimmt die Frame-Reihenfolge basierend auf der alphabetischen Reihenfolge der Dateinamen. Dies bedeutet, dass name500.pngdirekt danach name50.pngund nicht danach platziert wird, nachdem name450.pngich dies durch Hinzufügen von Nullen beheben kann, dies ist jedoch ärgerlich.

[News] Es gibt eine massive Überschneidung zwischen Ubuntu Stackexchange und Unix Stackexchange. Ich habe versucht, einige Themen hier zu kategorisieren .
hhh

In Bezug auf Punkt 3. können Sie convertnach dem Sortieren der Dateien noch verwenden . Wahrscheinlich funktioniert so etwasfiles=$(ls name*png | sort -n -tname -k1); convert $files animation.gif
Altroware

Für Punkt 1: convert hat einen -monitorParameter, der den Prozess verfolgt
Curlew

Antworten:


50

Neuere Versionen von ffmpeg haben kein -sameq ( siehe FAQ ), aber GIF-Unterstützung.

ffmpeg -i %03d.png output.gif

Wobei% 03d die Frame-ID in 3 Ziffern ist.

Sie können auch versuchen ffmpeg, einen Film aus einer Folge von Bildern zu erstellen und den Film dann in eine GIF-Animation umzuwandeln (erneut verwenden ffmpeg).

# cf. http://pages.uoregon.edu/noeckel/MakeMovie.html

# first convert an image sequence to a movie
ffmpeg -sameq -i %03d.jpg output.mp4

# ... and then convert the movie to a GIF animation
ffmpeg -i output.mp4 -pix_fmt rgb24 -s qcif -loop_output 0 output.gif

10
Diese Anweisung ist veraltet.
Highmaintenance

3
Die sameqOption ist nicht mehr verfügbar. Außerdem werden bei mir die ursprünglichen Bilddateien überschrieben und es wird keine gültige Filmdatei erstellt.
Lode

Was nützt es, den -sameqCode dort zu belassen? Warum möchten Sie überhaupt ein verlustbehaftetes Videoformat ( output.mp4) als temporäres Format verwenden ? Und wenn ja, warum "gleiche Qualität" wie die Eingabe anstelle einer sehr hohen Bitrate? Ein solches Artefakt wird die Situation für den GIF-Encoder nur verschlimmern. Wenn Sie ein Video als temporäres Medium benötigen, möchten Sie etwas verlustfreies wie huffyuv verwenden. Oder MJPEG ohne Transcodierung, einfach die Eingabe-JPEGs in ein MJPEG umwandeln. ( -codec:video copy).
Peter Cordes

80

convertist ein praktisches Kommandozeilen-Tool, um das zu tun. cdin den Ordner Ihrer enthält png -Dateien und diesen Befehl ausführen:

convert -delay 10 -loop 0 *.png animation.gif

Quelle: http://ubuntuforums.org/showthread.php?t=1132058


5
Die Frage erwähnt convertund einige Probleme bei der Verwendung. Ihre Antwort spricht keine von ihnen an.
Mat

3
Ab der ImageMagick-Version hat 6.8.7-4 2013-11-02 Q16dies bei mir funktioniert.
Rudy Matela

7
Das funktioniert, 10bedeutet aber 10 * 10ms, also ziemlich schnell. Eine Verzögerung von a 100beträgt 1 Sekunde.
Anne van Rossum

7
Verwenden Sie die Option -dispose previousoder -dispose 2wenn Sie mit transparenten PNGs arbeiten
Hải Phong

4
beachten Sie mir: Klammernerweiterung kann zur Angabe der Liste der Bilder , die als Argumente hilfreich sein, zum Beispiel pic_{0..20..2}.pngzu erweitert pic_0.png, den pic_2.pngganzen Weg zupic_20.png
Yibo Yang

19

Die Option convert's' --delaygilt nur für das nächste Bild in der Befehlszeile. Setzt also convert -delay 10 *nur die Verzögerung des ersten Frames auf 0,1 Sekunden. Die Option muss wiederholt werden:

convert $(for a in *; do printf -- "-delay 10 %s " $a; done; ) result.gif

Beim Konvertieren werden keine Frames sortiert, bei der Shell-Globierung hingegen *nicht. Wenn Sie wissen, dass Ihre Frames von 0 bis 700 nummeriert sind, können Sie die Zahlen einfach selbst berechnen:

convert $(for ((a=0; a<700; a++)); do printf -- "-delay 10 name%s.png " $a; done;) result.gif

5
Ich erlebe dieses Verhalten nicht mit convert, bei mir convert -delay 1000 -loop 0 *.png animation.gifkommt eine Verzögerung von 10s zwischen jedem Bild hinzu.
Lode

1
Sie können auch die Versionssortierung des lsBefehls verwenden. Das heißt:convert -delay 1000 $(ls -v name*png) output.gif
Erik

7

Aktualisieren:

Verwenden Sie convertfür das Png-to-Gif und dann Gifsicle für die Animation. Es ist keine One-App-To-Do-It-All-Lösung, aber auf jeden Fall skriptfähig.


GIMP kann animierte GIFs erstellen und ermöglicht die Steuerung von Timing / Delay und Repeat usw


3
Ich weiß über die Gimp Bescheid, aber ich weiß nicht, wie ich sie schreiben soll. Außerdem ist die Verwendung der Gimpe zum Erstellen von Animationen wie das Töten einer Fliege mit einer Kanone
Yotam,

1
Das ist eine schlechte Idee; Die Qualität wird schrecklich sein, da jeder Frame separat quantisiert wird.
Clément

2

ImageMagick kann eine hochwertige GIF-Animation erzeugen. Sehen Sie sich dieses Video an - http://www.youtube.com/watch?v=OFusYizJ-bA


6
Willkommen bei Unix & Linux! Im Allgemeinen möchten wir, dass die Antworten auf der Website für sich selbst stehen - Links sind großartig, aber wenn dieser Link jemals bricht, sollte die Antwort genügend Informationen enthalten, um weiterhin hilfreich zu sein. Bitte überlegen Sie, Ihre Antwort zu bearbeiten, um weitere Details zu erhalten. Weitere Informationen finden Sie in den FAQ .
slm

Was für ein nützlicher Kommentar oben ...
Luke

convert -delay 200 -loop 0 *.jpg output.gif
Luke

2

ffmeg wichtige GIF-Optionen + Testdaten

Um diese Antwort zu ergänzen :

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
ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i 'tmp.*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.gif \
;

Die Testdaten wurden generiert mit: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

Die wichtigen ffmpegOptionen, die ich hervorheben wollte, sind:

  • -patter_type glob: Bequeme Methode zum Auswählen von Bildern
  • -framerate 60und -r 15: Nehmen Sie 60 FPS für Eingabebilder an ( ffmpegkann es nicht anders wissen, da in Bildern keine FPS-Daten wie in Videoformaten enthalten sind), wählen Sie alle 4 Bilder eines aus, um die Größe zu verringern ( 4 == 60 / 15).
  • -vf scale=512:-1: Stellen Sie die Breite und Höhe proportional ein, um die Größe zu verringern und Platz zu sparen

Siehe auch:

Getestet in Ubuntu 18.10, ffmpeg 4.0.2.


-1

Zu Punkt 2

Die von mir verwendete Version von ImageMagick "display" (ImageMagick 6.7.2-7 2017-01-12) ignoriert die mit dem Befehl convert festgelegte Bildrate, um das animierte GIF zu erstellen. Versuchen Sie ein anderes Programm, um das animierte GIF wie Firefox anzuzeigen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.