Respostas:
Primeira corrida:
convert do.gif -coalesce temporary.gif
então
convert -size <original size> temporary.gif -resize 24x24 smaller.gif
gifsicle --resize 24x24 > do-24.gif
lata para isso também
Eu estava procurando por uma solução imagemagick como eu a conheço, mas no final fui com a sugestão de @ sam gifsicle
. Ele fez exatamente o que eu queria, sem problemas.
É possível otimizar o tamanho do arquivo resultante de várias maneiras, mas fui reduzindo o tamanho e o número de cores. Funcionou como um encanto:
gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
-coalesce
+ -deconstruct
Depois -coalesce
, você provavelmente deseja adicionar um -deconstruct
:
convert in.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
A causa principal do problema é que o GIF de entrada foi minimizado corretamente: o GIF permite que o próximo quadro seja apenas o retângulo modificado do anterior em um deslocamento.
-coalesce
depois expande todos os quadros para o tamanho original, o que faz o redimensionamento funcionar, mas não os comprime novamente como sua imagem de entrada: -deconstruct
é necessária para isso!
Usando os dados de teste desta resposta: Como crio um gif animado a partir de imagens estáticas (de preferência com a linha de comando)? podemos ver isso claramente com identify
:
$ identify out-convert.gif | head -n 3
out-convert.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.020u 0:00.019
out-convert.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019
out-convert.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019
$ convert out-convert.gif -resize 256x out.gif
$ identify out.gif | head -n 3
out.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[1] GIF 256x256 256x256+125+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[2] GIF 256x258 256x256+123+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
$ convert out-convert.gif -coalesce -resize 256x out-coalesce.gif
$ identify out-coalesce.gif | head -n 3
out-coalesce.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[1] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[2] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
$ convert out-convert.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
$ identify out-deconstruct.gif | head -n 3
out-deconstruct.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[1] GIF 135x135 256x256+60+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[2] GIF 135x136 256x256+59+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out.gif
out-coalesce.gif
out-deconstruct.gif
Primeiro, vemos como inserir o arquivo,, out-convert.gif
foi de fato compactado, pois o quadro 2 está apenas 516x516
em deslocamento 252+257
, enquanto o quadro 1 de tamanho completo 1024x1024
.
Então, se compararmos as três conversões:
out.gif
: Todos os quadros são 256x256
maiores ou maiores e enormes a cerca de 5MiB, TODO por quê?
Visualmente incorreto, pois esses 256x256
quadros aproximadamente têm um deslocamento diferente de zero, por exemplo, 125+128
para o quadro 2!
out-coalesce.gif
: todos os quadros são 256x256
e têm o deslocamento correto 0+0
.
A saída parece visualmente correta, mas o tamanho do arquivo de saída é de 2,0 MiB, que é maior que out-deconstruct.gif
out-deconstruct.gif
: quadros compactados, tamanho final de saída 1.9 MiB.
Não é consideravelmente menor que out-coalesce.gif
, mas acho que isso ocorre apenas porque o solo preto se comprime muito bem e pode ser muito significativo em geral.
ffmpeg e gifsicle
Eu também experimentei os seguintes comandos:
ffmpeg -i out-convert.gif -vf scale=256:-1 out-ffmpeg-small.gif
gifsicle --resize 256x256 out-convert.gif > out-gifsicle.gif
e ambos produziram uma saída de 1,5 MiB com aparência ainda menor.
Veja também: Como crio um gif animado a partir de imagens estáticas (de preferência com a linha de comando)?
TODO: por que eles podem torná-lo menor que convert
? Eles estão apenas selecionando melhores retângulos diferenciais mais mínimos ou algo mais?
Testado no Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8.
-coalesce
"cria uma visão completa da animação em cada ponto, um pouco como uma verdadeira tira de filme, em vez de uma sequência de animação. Essa sequência, conhecida como Animação Coalescente, é muito mais fácil de estudar, editar, modificar e otimizar".