¿Por qué el gif que creé es tan lento?

33

Estoy usando ImageMagick para convertir una colección de pngs en un solo gif. Quiero que este gif se repita lo más rápido posible.

Este es aproximadamente el resultado que espero (cortesía de Wikipedia ):

Rendimiento esperado

Esta es la salida que realmente obtengo:

salida real

En mi navegador (Firefox 17), el gif esperado se ejecuta más del doble de rápido que el gif real. Esto me sorprende, porque especifiqué que cada cuadro debería tener un retraso de 0.

Primero creé 36 pngs explotando el gif prestado de Wikipedia:

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

Luego solía coalescerecombinar los png en un gif.

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

identify confirma que cada cuadro no tiene retraso:

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,

Esto es, de hecho, menos retraso que el 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,

El gif real tiene menos retraso que el gif esperado. Entonces, ¿por qué el gif esperado es dos veces más rápido que el gif real?

Kevin
fuente
1
Por curiosidad, ¿qué sucede si establece el retraso en 1 en lugar de 0?
mgilson
1
parece un problema de velocidad de fotogramas.
SnakeDoc
@mgilson, acabo de probar eso. La imagen de retraso 0 y la imagen de retraso 1 parecen estar perfectamente sincronizadas. Lo cual es extraño, ya que la imagen de 1 retraso debería retrasarse 36/100 de segundo por bucle.
Kevin
1
tl; dr sobre esta pregunta: Uso-delay 2 .
Matt M.

Respuestas:

17

Experimenté y creé la versión de 10 ms (retraso = 1).

Ejemplo de retraso de 10 ms

Parece que los programas que procesan gifs tienden a no respetar las tasas de retraso de centésimas de segundo. En cambio, usan un valor que es mucho mayor que el valor pequeño que usted eligió.

Realmente no puedo comentar sobre las razones por las que hacen esto. Me he encontrado con más de una razón, y es posible que todo sea especulación.

En general, recomendaría que utilice un retraso de al menos doscientos de segundo en todos los casos.

Fuentes (que demuestran cómo parece haber múltiples razones para esto. Algunas son relativamente antiguas):

David Mah
fuente
1
Si el programa de renderizado ralentiza todos los gifs que son demasiado rápidos, entonces el gif de Wikipedia sería tan lento como mi propio gif. Pero no lo es. ¿Por qué Wikipedia puede romper el límite de velocidad y yo no?
Kevin
2
@Kevin: ralentiza todos los GIF que son demasiado rápidos. Tus GIF son demasiado rápidos. Los GIF de Wikipedia no son demasiado rápidos. Debe reducir la velocidad para no ser "demasiado rápido".
David Schwartz
Los retrasos de trama para el rango de gif de Wikipedia oscilan entre 20 ms y 50 ms. Si configuro mi propio retraso de trama en 20 ms, aún es más lento, aunque en teoría cumple con los mismos criterios "no demasiado rápidos" como el gif de Wikipedia.
Kevin
2
Si, junto con una imagen de Wikipedia que tiene retrasos de 20 ms, incluye un gif que ha creado también con retrasos de 20 ms, lo echaré un vistazo.
David Mah
2
Estaba equivocado. El gif de 20 ms que creé es tan rápido como el gif de Wikipedia.
Kevin
18

Parece que @DavidMah tiene razón. En mi sistema Linux, el retraso mínimo es 0.5:

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

Por alguna razón, las imágenes parecen no mostrarse correctamente en mi navegador. Usando un visor de imágenes local ( eom), la primera imagen es tan lenta como la de la pregunta original y las otras dos son más rápidas que las de la wikipedia. Estoy publicando de todos modos en caso de que sea un problema específico de mi navegador. En cualquier caso, debería obtener mejores velocidades si intenta los comandos publicados anteriormente.


ACTUALIZACIÓN: Parece que hay 2 problemas. Los navegadores (al menos y firefox y chromium que se ejecutan en Linux) no pueden mostrar gifs creados con un retraso <1.5. 1.5 funciona bien, 1.4 es lento. Mi visor de imágenes puede manejar retrasos de 0.5 y superiores. Intente descargar una de las imágenes anteriores y ábrala en su visor de imágenes favorito. Además, eche un vistazo a estos:

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

ACTUALIZACIÓN2: @DavidMah señala en los comentarios a continuación que los valores decimales se redondean al entero más cercano. Entonces, 1.4 se redondea a 1, que es demasiado lento, mientras que 1.5 se redondea a 2, lo cual está bien.

terdon
fuente
77
Tenga cuidado al tratar de asignar retrasos a los valores decimales. La demora se almacena en dos bytes (las implicaciones en esto es que la demora de trama más grande es 655360 ms) y es un entero sin signo. Convertir es redondear sus valores para ser el entero más cercano. en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF
David Mah
3
@DavidMah ah, eso tiene sentido. Entonces 1.5 funciona porque se redondea a 2 mientras que 1.4 no porque se redondea a 1.
terdon
6

He tenido más éxito al usar la XxYnotación de retraso, esencialmente xes como un /, así que si especificas -delay 1x20, el marco se muestra durante 1/20 de segundo.

kralyk
fuente