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

33

J'utilise ImageMagick pour transformer une collection de pngs en un seul gif. Je veux que ce gif boucle le plus rapidement possible.

C'est approximativement le résultat que j'attends (avec l'aimable autorisation de Wikipedia ):

production attendue

Voici la sortie que j'obtiens réellement:

sortie réelle

Sur mon navigateur (Firefox 17), le gif attendu s'exécute plus de deux fois plus vite que le gif réel. Cela me surprend, car j'ai spécifié que chaque trame devrait avoir 0 retard.

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'avais l'habitude coalescede recombiner les pngs en un gif.

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

identify confirme que chaque trame 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?

Kevin
la source
1
Par curiosité, que se passe-t-il si vous définissez le retard sur 1 plutôt que sur 0?
mgilson
1
ressemble à un problème de fréquence d'images.
SnakeDoc
@mgilson, je viens d'essayer ça. L'image à retard 0 et l'image à retard 1 semblent parfaitement synchronisées. Ce qui est étrange, car l'image à 1 retard devrait être en retard de 36 / 100e de seconde à chaque boucle.
Kevin
1
tl; dr sur cette question: Utilisez-delay 2 .
Matt M.

Réponses:

17

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

Exemple de retard de 10 ms

Il semble que les programmes qui rendent des gifs tendent à ne pas respecter les taux de retard de 0 centième de seconde. Au lieu de cela, ils utilisent une valeur bien supérieure à 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 toutes ses spéculations.

En général, je vous recommande d'utiliser un délai d'au moins deux cents de seconde dans tous les cas.

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

David Mah
la source
1
Si le programme de rendu ralentit tous les gifs qui sont trop rapides, alors le gif de Wikipedia serait tout aussi lent que mon propre gif. Mais ce n'est pas le cas. Pourquoi Wikipedia peut-il dépasser la limite de vitesse, et je ne peux pas?
Kevin
2
@Kevin: Cela ralentit tous les GIF trop rapides. Vos GIF sont trop rapides. Les GIF de Wikipédia ne sont pas trop rapides. Vous devez ralentir pour ne pas être "trop ​​rapide".
David Schwartz
Les retards de trame pour le gif Wikipedia varient entre 20 ms et 50 ms. Si je fixe mon propre délai de trame à 20 ms, il est toujours plus lent, même s'il théoriquement répond aux mêmes critères "pas trop rapides" que le gif Wikipedia.
Kevin
2
Si, à côté d'une image wikipedia qui a des retards de 20 ms, vous incluez un gif que vous avez également créé avec des retards de 20 ms, je vais jeter un oeil.
David Mah
2
Je me trompais. Le gif de 20 ms que j'ai créé est en effet aussi rapide que le gif Wikipedia.
Kevin
18

Il semble que @DavidMah ait 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

entrez la description de l'image ici

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

entrez la description de l'image ici

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

entrez la description de l'image ici

Pour une raison quelconque, les images ne semblent pas s'afficher correctement dans mon navigateur. En utilisant une visionneuse d'image locale ( eom), la 1ère image est aussi lente que celle de la question d'origine et les deux autres sont plus rapides que celles de Wikipédia. Je poste quand même en cas de problème spécifique à mon navigateur. Dans tous les cas, vous devriez obtenir de meilleures vitesses si vous essayez les commandes publiées ci-dessus.


MISE À JOUR: Il semble y avoir 2 problèmes. Les navigateurs (au moins y firefox et chrome fonctionnant sous 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 retards de 0,5 et plus. Essayez de télécharger l'une des images ci-dessus et de l'ouvrir dans votre visionneuse d'images préférée. Jetez également un œil à ces derniers:

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

entrez la description de l'image ici

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

entrez la description de l'image ici

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

terdon
la source
7
Attention à ne pas attribuer de délais aux valeurs décimales. Le retard est stocké sur deux octets (ce qui implique que le plus grand retard de trame est de 655360 ms) et est un entier non signé. Convert arrondit vos valeurs pour être l'entier le plus proche. en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF
David Mah
3
@DavidMah ah, c'est logique. Donc 1.5 fonctionne parce qu'il est arrondi à 2 tandis que 1.4 ne fonctionne pas parce qu'il est arrondi à 1.
terdon
6

J'ai eu plus de succès en utilisant la XxYnotation de retard, essentiellement xc'est comme un /, donc si vous spécifiez -delay 1x20, le cadre est affiché pendant 1 / 20e de seconde.

Kralyk
la source