como redimensionar um arquivo GIF animado usando o ImageMagick?

46

Quero redimensionar um arquivo GIF animado do.gif insira a descrição da imagem aqui

Se eu convert do.gif -resize 24x24\! do-24.gifobtê-lo redimensionado em do-24.gif, mas não animadoinsira a descrição da imagem aqui

Como redimensioná-lo da maneira correta para obter a mesma animação?

zuba
fonte

Respostas:

56

Primeira corrida:

convert do.gif -coalesce temporary.gif

então

convert -size <original size> temporary.gif -resize 24x24 smaller.gif
phipsalabim
fonte
2
-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".
sam
28
gifsicle --resize 24x24 > do-24.giflata para isso também
sam
2
Observe que a visualização coalescida é muito maior que a otimizada (3,2 vezes no meu teste) e o redimensionamento produz uma imagem coalescente, que também pode ser maior que o original no tamanho do arquivo (2,3 vezes no meu teste), mesmo que a resolução é menor. Quando tento redimensionar diretamente, parece bem e tem um tamanho de arquivo pequeno, embora talvez funcione apenas para esta imagem.
endolith
1
O gifsicle produziu uma saída otimizada e muito melhor para o meu caso de uso. Obrigado @sam!
sj26
4
converter temporary.gif - redimensionar 24x24, menor.gif funciona para mim., sem especificar o tamanho da entrada.
AMB
5

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
Peter Perháč
fonte
3

-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

insira a descrição da imagem aqui

out-coalesce.gif

insira a descrição da imagem aqui

out-deconstruct.gif

insira a descrição da imagem aqui

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.

Ciro Santilli adicionou uma nova foto
fonte