Perché la gif che ho creato è così lenta?


33

Sto usando ImageMagick per trasformare una raccolta di png in una singola gif. Voglio che questa gif esegua il loop il più rapidamente possibile.

Questo è approssimativamente l'output che mi aspetto (per gentile concessione di Wikipedia ):

uscita prevista

Questo è l'output che effettivamente ottengo:

uscita effettiva

Sul mio browser (Firefox 17), la gif prevista funziona più del doppio della gif effettiva. Questo mi sorprende, perché ho specificato che ogni frame dovrebbe avere 0 delay.

Per prima cosa ho creato 36 png esplodendo la gif presa in prestito da Wikipedia:

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

Quindi coalescericombinavo i png in una gif.

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

identify conferma che ogni frame non ha alcun ritardo:

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,

Questo è, in effetti, un ritardo inferiore rispetto all'originale:

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,

La gif effettiva ha meno ritardi della gif prevista. Quindi perché la gif prevista è due volte più veloce della gif attuale?


1
Per curiosità, cosa succede se si imposta il ritardo su 1 anziché su 0?
mgilson,

1
sembra un problema di frame rate.
SnakeDoc

@mgilson, l'ho appena provato. L'immagine 0-delay e 1-delay sembrano essere perfettamente sincronizzate. Il che è strano, poiché l'immagine a 1 ritardo dovrebbe rimanere indietro di 36/100 di secondo ogni ciclo.
Kevin,

1
tl; dr su questa domanda: utilizzare-delay 2 .
Matt M.

Risposte:


17

Ho sperimentato e creato la versione 10ms (delay = 1).

Esempio di ritardo di 10 ms

Sembra che i programmi che rendono le gif tendano a non onorare i ritardi di 0 centesimi di secondo. Invece, usano un valore che è molto maggiore del valore piccolo che hai scelto.

Non posso davvero commentare i motivi per cui lo fanno. Mi sono imbattuto in più di una ragione ed è possibile che sia tutta una speculazione.

In generale, consiglierei di utilizzare un ritardo di almeno duecento secondi al secondo in tutti i casi.

Fonti (che dimostrano come sembrano esserci molteplici ragioni per questo. Alcune sono relativamente vecchie):


1
Se il programma di rendering rallenta tutte le gif che sono troppo veloci, la gif di Wikipedia sarebbe altrettanto lenta della mia gif. Ma non lo è. Perché Wikipedia può infrangere il limite di velocità e io no?
Kevin,

2
@Kevin: rallenta tutte le GIF troppo veloci. Le tue GIF sono troppo veloci. Le GIF di Wikipedia non sono troppo veloci. Devi rallentare in modo da non essere "troppo veloce".
David Schwartz,

I ritardi dei frame per la gif di Wikipedia vanno da 20 ms a 50 ms. Se imposto il mio ritardo di frame su 20 ms, è ancora più lento, anche se teoricamente soddisfa gli stessi criteri "non troppo veloci" di gif di Wikipedia.
Kevin,

2
Se, accanto a un'immagine di Wikipedia che ha ritardi di 20 ms, includi una gif che hai creato anche con ritardi di 20 ms, darò un'occhiata.
David Mah,

2
Mi sono sbagliato. La gif di 20 ms che ho creato è davvero veloce come la gif di Wikipedia.
Kevin,

18

Sembra che @DavidMah abbia ragione. Sul mio sistema Linux, il ritardo minimo è 0,5:

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

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine

Per qualche motivo le immagini sembrano non essere visualizzate correttamente nel mio browser. Utilizzando un visualizzatore di immagini locale ( eom), la prima immagine è lenta come quella nella domanda originale ed entrambe le altre sono più veloci di quelle di Wikipedia. Sto pubblicando comunque nel caso si tratti di un problema specifico per il mio browser. In ogni caso, dovresti ottenere velocità migliori se provi i comandi pubblicati sopra.


AGGIORNAMENTO: sembrano esserci 2 problemi. I browser (almeno y firefox e chromium in esecuzione su Linux) non possono visualizzare gif create con un ritardo <1.5. 1.5 funziona bene, 1.4 è lento. Il mio visualizzatore di immagini può gestire ritardi di 0,5 e superiori. Prova a scaricare una delle immagini sopra e aprila nel tuo visualizzatore di immagini preferito. Inoltre, dai un'occhiata a questi:

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

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine

UPDATE2: @DavidMah sottolinea nei commenti seguenti che i valori decimali vengono arrotondati al numero intero più vicino. Quindi, 1.4 viene arrotondato a 1, il che è troppo lento, mentre 1.5 viene arrotondato a 2, il che è OK.


7
Fare attenzione a provare ad assegnare ritardi ai valori decimali. Il ritardo è memorizzato in due byte (le implicazioni sono che il ritardo del frame più grande è 655360 ms) ed è un numero intero senza segno. Converti sta arrotondando i valori in modo che siano il numero intero più vicino. it.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF
David Mah

3
@DavidMah ah, ha senso. Quindi 1.5 funziona perché è arrotondato a 2 mentre 1.4 non perché è arrotondato a 1.
Terdon

6

Ho avuto più successo usando la XxYnotazione del ritardo, essenzialmente xè come un /, quindi se specifichi -delay 1x20, il fotogramma viene visualizzato per 1/20 di secondo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.