Warum ist das GIF, das ich erstellt habe, so langsam?

33

Ich verwende ImageMagick, um eine Sammlung von PNGs in ein einziges GIF zu verwandeln. Ich möchte, dass dieses GIF so schnell wie möglich in einer Schleife angezeigt wird.

Dies ist ungefähr die Ausgabe, die ich erwarte (mit freundlicher Genehmigung von Wikipedia ):

erwartete Ausgabe

Dies ist die Ausgabe, die ich tatsächlich bekomme:

tatsächliche Leistung

In meinem Browser (Firefox 17) läuft das erwartete GIF mehr als doppelt so schnell wie das tatsächliche GIF. Das überrascht mich, denn ich habe festgelegt, dass jeder Frame 0 Delay haben soll.

Zuerst habe ich 36 PNGs erstellt, indem ich das von Wikipedia geliehene GIF explodiert habe:

--caution: command generates 36 pngs
convert.exe newton.gif newton_%d.png

Dann habe ich coalescedie PNGs zu einem GIF zusammengefasst.

convert.exe -dispose none -delay 0 newton_%d.png[0-35] -coalesce output.gif

identify bestätigt, dass jeder Frame keine Verzögerung hat:

identify.exe -format "%T, " output.gif
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

Dies ist in der Tat weniger Verzögerung als das Original:

identify.exe -format "%T, " newton.gif
5, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2,

Das tatsächliche GIF hat eine geringere Verzögerung als das erwartete GIF. Warum ist das erwartete GIF also doppelt so schnell wie das tatsächliche GIF?

Kevin
quelle
1
Was passiert aus Neugier, wenn Sie die Verzögerung auf 1 anstatt auf 0 setzen?
Mgilson
1
sieht aus wie ein Problem mit der Framerate.
SnakeDoc
@mgilson, das habe ich gerade ausprobiert. Das 0-Delay-Bild und das 1-Delay-Bild scheinen perfekt synchron zu sein. Das ist seltsam, da das Bild mit einer Verzögerung bei jeder Schleife um 36/100 Sekunden nacheilen sollte.
Kevin
1
tl; dr auf diese Frage: Verwenden Sie-delay 2 .
Matt M.

Antworten:

17

Ich habe experimentiert und die 10ms (delay = 1) Version erstellt.

Beispiel für eine Verzögerung von 10 ms

Es scheint, dass Programme, die Gifs rendern, dazu neigen, die 0-Hundertstelsekunden-Verzögerungsrate nicht zu berücksichtigen. Stattdessen verwenden sie einen Wert, der viel größer ist als der von Ihnen gewählte kleine Wert.

Ich kann die Gründe, warum sie dies tun, nicht wirklich kommentieren. Ich bin auf mehr als einen Grund gestoßen, und es ist möglich, dass alles Spekulationen sind.

Im Allgemeinen würde ich empfehlen, dass Sie in allen Fällen eine Verzögerung von mindestens zwei Hundertstel Sekunden verwenden.

Quellen (die belegen, dass es mehrere Gründe dafür zu geben scheint. Einige sind relativ alt):

David Mah
quelle
1
Wenn das Rendering-Programm alle zu schnellen Gifs verlangsamt, ist das Gif von Wikipedia genauso langsam wie mein eigenes Gif. Ist es aber nicht. Warum kann Wikipedia das Tempolimit überschreiten und ich nicht?
Kevin
2
@ Kevin: Es verlangsamt alle GIFs, die zu schnell sind. Ihre GIFs sind zu schnell. Die GIFs von Wikipedia sind nicht zu schnell. Sie müssen langsamer fahren, damit Sie nicht "zu schnell" werden.
David Schwartz
Die Frame-Verzögerungen für das Wikipedia-GIF liegen zwischen 20 ms und 50 ms. Wenn ich meine eigene Frame-Verzögerung auf 20 ms einstelle, ist sie immer noch langsamer, obwohl sie theoretisch die gleichen "nicht zu schnellen" Kriterien erfüllt wie das Wikipedia-GIF.
Kevin
2
Wenn Sie neben einem Wikipedia-Bild mit 20 ms Verzögerung ein GIF einfügen, das Sie auch mit 20 ms Verzögerung erstellt haben, werde ich einen Blick darauf werfen.
David Mah
2
Ich lag falsch. Das 20 ms Gif, das ich erstellt habe, ist in der Tat so schnell wie das Wikipedia Gif.
Kevin
18

Es sieht so aus, als ob @DavidMah richtig ist. Auf meinem Linux-System beträgt die minimale Verzögerung 0,5:

convert -dispose none -delay 0.4 newton_%d.png[0-35] -coalesce output0.4.gif

Bildbeschreibung hier eingeben

convert -dispose none -delay 0.5 newton_%d.png[0-35] -coalesce output0.5.gif

Bildbeschreibung hier eingeben

convert -dispose none -delay 1 newton_%d.png[0-35] -coalesce output1.gif

Bildbeschreibung hier eingeben

Aus irgendeinem Grund werden die Bilder in meinem Browser nicht richtig angezeigt. Wenn Sie einen lokalen Bildbetrachter ( eom) verwenden, ist das erste Bild so langsam wie das in der ursprünglichen Frage und beide anderen sind schneller als die von Wikipedia. Ich poste trotzdem, falls es sich um ein spezifisches Problem meines Browsers handelt. In jedem Fall sollten Sie bessere Geschwindigkeiten erzielen, wenn Sie die oben angegebenen Befehle ausführen.


UPDATE: Es scheint 2 Probleme zu geben. Browser (mindestens Firefox und Chromium, die unter Linux ausgeführt werden) können keine GIFs anzeigen, die mit einer Verzögerung von <1,5 erstellt wurden. 1.5 funktioniert gut, 1.4 ist langsam. Mein Bildbetrachter kann Verzögerungen von 0,5 und mehr verarbeiten. Laden Sie eines der oben genannten Bilder herunter und öffnen Sie es in Ihrem bevorzugten Bildbetrachter. Schauen Sie sich auch diese an:

convert -dispose none -delay 1.4 newton_%d.png[0-35] -coalesce output1.4.gif

Bildbeschreibung hier eingeben

convert -dispose none -delay 1.5 newton_%d.png[0-35] -coalesce output1.5.gif

Bildbeschreibung hier eingeben

UPDATE2: @DavidMah weist in den Kommentaren unten darauf hin, dass Dezimalwerte auf die nächste Ganzzahl gerundet werden. Also wird 1.4 auf 1 gerundet, was zu langsam ist, während 1.5 auf 2 gerundet wird, was in Ordnung ist.

terdon
quelle
7
Versuchen Sie nicht, den Dezimalwerten Verzögerungen zuzuweisen. Die Verzögerung wird in zwei Bytes gespeichert (dies hat zur Folge, dass die größte Frame-Verzögerung 655360 ms beträgt) und ist eine ganze Zahl ohne Vorzeichen. Convert rundet Ihre Werte auf die nächste Ganzzahl. en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF
David Mah
3
@ DavidMah ah, das macht Sinn. 1,5 funktioniert also, weil es auf 2 gerundet wird, während 1,4 nicht, weil es auf 1 gerundet wird.
terdon
6

Ich hatte mehr Erfolg mit der XxYVerzögerungsnotation, im Wesentlichen xist das wie ein /, wenn Sie also angeben -delay 1x20, wird der Frame für 1/20 Sekunde angezeigt.

kralyk
quelle