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.giflata 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.
-coalescedepois 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.giffoi de fato compactado, pois o quadro 2 está apenas 516x516em 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 256x256maiores ou maiores e enormes a cerca de 5MiB, TODO por quê?
Visualmente incorreto, pois esses 256x256quadros aproximadamente têm um deslocamento diferente de zero, por exemplo, 125+128para o quadro 2!
out-coalesce.gif: todos os quadros são 256x256e 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".