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

30

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

Esta é aproximadamente a saída esperada (cortesia de Wikipedia ):

Estaéasaídaquerealmenterecebo:

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

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

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

Então eu usei coalesce para recombinar 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 é, na verdade, menos atraso do 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?

    
por Kevin 22.03.2013 / 15:25

3 respostas

17

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

Parecequeprogramasquerenderizamgifstendemanãohonraros0centésimosdeumsegundoatraso.Emvezdisso,elesusamumvalormuitomaiorqueovalorpequenoquevocêescolheu.

Eunãopossorealmentecomentarsobreasrazõespelasquaiselesfazemisso.Eumedepareicommaisdeummotivo,eépossívelquetudosejaespeculação.

Emgeral,recomendoquevocêuseumatrasodepelomenosduascentenasdesegundoemtodososcasos.

Fontes(quedemonstramcomoparecehaverváriasrazõesparaisso.Algumassãorelativamenteantigas):

por 22.03.2013 / 16:13
18

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

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

convert-disposenone-delay0.5newton_%d.png[0-35]-coalesceoutput0.5.gif

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

Poralgummotivo,asimagensparecemnãoserexibidascorretamentenomeunavegador.Usandoumvisualizadordeimagenslocal(eom),aprimeiraimagemétãolentaquantoadaperguntaoriginaleambasasoutrassãomaisrápidasdoqueasdaWikipédia.Estoupostandomesmoassim,casosejaumproblemaespecíficodomeunavegador.Emqualquercaso,vocêdeveobtermelhoresvelocidadessevocêtentaroscomandospostadosacima.

UPDATE:parecehaver2problemas.Osnavegadores(pelomenos,yfirefoxechromiumemexecuçãonoLinux)nãopodemexibirgifscriadoscomumatraso<1.5.1.5funcionabem,1.4élento.Meuvisualizadordeimagenspodelidarcomatrasosde0,5eacima.Tentebaixarumadasimagensacimaeabra-anoseuvisualizadordeimagensfavorito.Alémdisso,dêumaolhadanestes:

convert-disposenone-delay1.4newton_%d.png[0-35]-coalesceoutput1.4.gif

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

UPDATE2: @DavidMah aponta nos comentários abaixo que os valores decimais são arredondados para o inteiro mais próximo. Então, 1.4 é arredondado para 1, que é muito lento, enquanto 1.5 é arredondado para 2, o que é OK.

    
por 22.03.2013 / 16:43
5

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

por 02.12.2014 / 13:55