Por que o gif que eu criei é tão lento?

33

Estou usando o ImageMagick para transformar uma coleção de pngs em um único gif. Quero que esse gif faça um loop o mais rápido possível.

Esta é aproximadamente a saída que eu espero (cortesia da Wikipedia ):

resultado esperado

Esta é a saída que realmente recebo:

saída real

No meu navegador (Firefox 17), o gif esperado é executado duas vezes mais rápido que o gif real. Isso me surpreende, porque especifiquei que cada quadro deveria ter 0 atraso.

Primeiro, criei 36 pngs explodindo o gif emprestado da Wikipedia:

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

Então eu coalescerecombinava os pngs em um gif.

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

identify confirma que cada quadro não tem atraso:

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,

Isso é, de fato, menos atraso que o 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,

O gif real tem menos atraso que o gif esperado. Então, por que o gif esperado é duas vezes mais rápido que o gif real?

Kevin
fonte
1
Por curiosidade, o que acontece se você definir o atraso para 1 em vez de 0?
mgilson
1
parece um problema de taxa de quadros.
SnakeDoc 22/03/2013
@ mgilson, eu apenas tentei isso. As imagens com atraso 0 e 1 atraso parecem estar perfeitamente sincronizadas. O que é estranho, já que a imagem de 1 atraso deve ficar atrás de 36 / 100ths de segundo a cada loop.
22413 Kevin
1
dr sobre esta questão: Use-delay 2 .
Matt M.

Respostas:

17

Eu experimentei e criei a versão 10ms (delay = 1).

Exemplo de atraso de 10 ms

Parece que os programas que renderizam gifs tendem a não respeitar as taxas de atraso de 0 centésimos de segundo. Em vez disso, eles usam um valor muito maior que o pequeno valor que você escolheu.

Eu realmente não posso comentar sobre as razões pelas quais eles fazem isso. Eu me deparei com mais de uma razão, e é possível que seja tudo especulação.

Em geral, eu recomendaria que você use um atraso de pelo menos duas centenas de segundo em todos os casos.

Fontes (que demonstram como parece haver várias razões para isso. Algumas são relativamente antigas):

David Mah
fonte
1
Se o programa de renderização diminuir a velocidade de todos os gifs que são muito rápidos, o gif da Wikipedia seria tão lento quanto o meu próprio gif. Mas não é. Por que a Wikipedia pode quebrar o limite de velocidade e eu não?
22413 Kevin
2
@ Kevin: Retarda todos os GIFs que são muito rápidos. Seus GIFs são muito rápidos. Os GIFs da Wikipedia não são muito rápidos. Você precisa diminuir a velocidade para não ser "muito rápido".
David Schwartz
Os atrasos de quadro para o gif da Wikipedia variam entre 20 e 50 ms. Se eu definir o meu próprio atraso de quadro para 20 ms, ele ainda será mais lento, embora teoricamente atenda aos mesmos critérios "não muito rápidos" que o gif da Wikipedia.
22413 Kevin
2
Se, juntamente com uma imagem da Wikipedia com atrasos de 20 ms, você incluir um gif que você criou também com atrasos de 20 ms, darei uma olhada.
23413 David Mah
2
Eu estava errado. O gif de 20 ms que criei é realmente tão rápido quanto o gif da Wikipedia.
22413 Kevin
18

Parece que @DavidMah está certo. No meu sistema Linux, o atraso mínimo é 0,5:

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

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

Por algum motivo, as imagens parecem não ser exibidas corretamente no meu navegador. Usando um visualizador de imagens local ( eom), a 1ª imagem é tão lenta quanto a da pergunta original e as outras duas são mais rápidas que as da Wikipedia. Estou postando assim mesmo, caso seja um problema específico do meu navegador. Em qualquer caso, você deve obter velocidades melhores se tentar os comandos postados acima.


ATUALIZAÇÃO: Parece haver 2 problemas. Navegadores (pelo menos y Firefox e Chromium em execução no Linux) não podem exibir gifs criados com um atraso <1.5. 1,5 funciona bem, 1,4 é lento. Meu visualizador de imagens pode lidar com atrasos de 0,5 e acima. Tente baixar uma das imagens acima e abri-la no seu visualizador de imagens favorito. Além disso, dê uma olhada neles:

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

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

UPDATE2: @DavidMah aponta nos comentários abaixo que os valores decimais são arredondados para o número inteiro mais próximo. Portanto, 1,4 é arredondado para 1, que é muito lento, enquanto 1,5 é arredondado para 2, o que é OK.

Terdon
fonte
7
Cuidado ao tentar atribuir atrasos aos valores decimais. O atraso é armazenado em dois bytes (a implicação disso é que o maior atraso de quadro é 655360ms) e é um número inteiro não assinado. Converter está arredondando seus valores para o número inteiro mais próximo. pt.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF
David Mah
3
@DavidMah ah, isso faz sentido. Assim 1,5 funciona porque ele é arredondado para 2, enquanto 1,4 não porque ele é arredondado para 1.
terdon
6

Eu tive mais sucesso usando a XxYnotação de atraso, essencialmente a xé como a /, portanto, se você especificar -delay 1x20, o quadro será exibido por 1/20 de segundo.

kralyk
fonte