web-dev-qa-db-fra.com

Pourquoi le gif que j'ai créé est-il si lent?

J'utilise ImageMagick pour transformer une collection de pngs en un seul gif. Je veux que cette image soit bouclée le plus rapidement possible.

Ceci correspond approximativement au résultat attendu (avec la permission de Wikipedia ):

expected output

Voici le résultat obtenu:

actual output

Sur mon navigateur (Firefox 17), le gif attendu est deux fois plus rapide que le gif réel. Cela me surprend, car j’ai précisé que chaque image devrait avoir 0 délai.

J'ai d'abord créé 36 pngs en faisant exploser le gif emprunté à Wikipedia:

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

Ensuite, j'ai utilisé coalesce pour recombiner les pngs en un gif.

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

identify confirme que chaque image n'a pas de retard:

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,

C’est en fait moins de retard que l’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,

Le gif réel a moins de retard que le gif attendu. Alors pourquoi le gif attendu est-il deux fois plus rapide que le gif réel?

32
Kevin

J'ai expérimenté et créé la version 10ms (delay = 1).

10ms delay example

Il semble que les programmes qui rendent les gifs ont tendance à ne pas respecter les taux de retard de 0 centième de seconde. Au lieu de cela, ils utilisent une valeur beaucoup plus grande que la petite valeur que vous avez choisie.

Je ne peux pas vraiment commenter les raisons pour lesquelles ils font cela. J'ai rencontré plus d'une raison, et il est possible que ce soit une pure spéculation.

En général, je vous recommanderais d’utiliser un délai d’au moins deux centièmes de seconde dans tous les cas.

Sources (qui démontrent qu'il semble y avoir plusieurs raisons à cela. Certaines sont relativement anciennes):

17
David Mah

On dirait que @ DavidMah a raison. Sur mon système Linux, le délai minimum est de 0.5:

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

enter image description here

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

enter image description here

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

enter image description here

Pour une raison quelconque, les images ne semblent pas être affichées correctement dans mon navigateur. Avec une visionneuse d'images locale (eom), la première image est aussi lente que celle de la question d'origine et les deux autres sont plus rapides que celles de wikipedia. Je poste quand même au cas où il s'agirait d'un problème spécifique à mon navigateur. Dans tous les cas, vous devriez obtenir de meilleures vitesses si vous essayez les commandes ci-dessus.


MISE À JOUR: Il semble y avoir 2 problèmes. Les navigateurs (au moins y firefox et chrome exécutant Linux) ne peuvent pas afficher les gifs créés avec un délai <1,5. 1,5 fonctionne bien, 1,4 est lent. Ma visionneuse d'images peut gérer des délais de 0,5 et plus. Essayez de télécharger l'une des images ci-dessus et de l'ouvrir dans votre lecteur d'images préféré. Aussi, regardez ces:

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

enter image description here

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

enter image description here

UPDATE2: @DavidMah indique dans les commentaires ci-dessous que les valeurs décimales sont arrondies à l'entier le plus proche. Ainsi, 1,4 est arrondi à 1, ce qui est trop lent, tandis que 1,5 est arrondi à 2, ce qui est OK.

18
terdon

J'ai eu plus de succès en utilisant la notation XxY delay. Essentiellement, la x ressemble à un /; si vous spécifiez -delay 1x20, le cadre est affiché pendant 1/20ème de seconde.

5
kralyk