Como crio um gif animado a partir de imagens estáticas (de preferência com a linha de comando)?

78

Quero fazer uma .gifimagem animada a partir de um determinado conjunto de .jpgfotos.

Eu preferiria fazê-lo na linha de comando, portanto, as ferramentas de linha de comando seriam muito bem-vindas.

Maythux
fonte

Respostas:

87

Você pode usar o pacote ImageMagick . Instale-o usando o comando:

sudo apt-get install imagemagick

Agora você pode criar um gifnúmero de imagens ( jpg) usando:

convert -delay 20 -loop 0 *.jpg myimage.gif
Maythux
fonte
6
Por favor, inclua aqui como redimensiona a animação gif etc. em 50%. Etc -resize 50%.
Léo Léopold Hertz,
Ubuntu 18.10 falhou com "recursos de cache esgotado" para estas imagens: github.com/cirosantilli/media/blob/master/... relacionados: superuser.com/questions/1178666/...
Ciro Santilli新疆改造中心法轮功六四事件
Usuários ImageMagick provavelmente também quer: -deconstruct. Eu também descobri que ImageMagick é muito memória com fome, ver benchmarks: askubuntu.com/a/1102183/52975
Ciro Santilli新疆改造中心法轮功六四事件
convert -delay 0 -loop 0 *.tif myanimated.giffuncionou bem, em 720 arquivos tif
ron
46

Para concluir a resposta do @Maythux:

Para evitar gerar um arquivo muito grande, você pode usar a -resizeopção:

No meu caso, tenho imagens de 4608x3456 e o ​​gif gerado foi superior a 300M para 32 imagens

convert -resize 20% -delay 20 -loop 0 *.jpg myimage.gif

ou

convert -resize 768x576 -delay 20 -loop 0 *.jpg myimage.gif

Cuide de * .jpg

*.jpg é um pouco ruim ao lidar com valores numéricos, você pode gerar um gif com fotos não classificadas.

$ ls|cat
21-33-26_1.jpg
21-33-26_10.jpg   // <--- this one
21-33-26_2.jpg
21-33-26_3.jpg
21-33-26_4.jpg
21-33-26_5.jpg
21-33-26_6.jpg
21-33-26_7.jpg
21-33-26_8.jpg
21-33-26_9.jpg
21-33-28_1.jpg    // <--- should be here    
21-33-28_2.jpg
21-33-28_3.jpg
...

Como as fotos foram tiradas muito rapidamente (10 / s), todas têm o mesmo tempo de modificação e você não pode enganar usando, ls -tpor exemplo. No ubuntu, você pode usar ls -valgo como:

convert -resize 768x576 -delay 20 -loop 0 `ls -v` myimage.gif

Classificar numericamente é bastante complicado no Mac OS X, acho que você precisará criar um script personalizado.

Ninsuo
fonte
4
Você pode evitar o problema de * .jpg enviando números de preenchimento com zeros. "01.jpg" em vez de "1.jpg" e assim por diante. Se você tiver três dígitos, então "001.jpg", "010.jpg", etc.
bigreddmachine 28/11
2
Existem várias maneiras de contornar o problema de sequência do nome do arquivo. Incluindo find, sort, a expansão cinta, e assim por diante. A lsferramenta é notoriamente inadequada para esse tipo de coisa. Use find. Há um pouco de uma curva de aprendizado, mas vale a pena.
vozes
Alguns usuários podem estar interessados ​​em editar nomes de arquivos com massren: github.com/laurent22/massren
Graham P Heath
leva séculos para terminar. Existe uma opção detalhada?
ouranos 18/07
21

Não tenho reputação suficiente para comentar, mas em vez de modificar os nomes dos arquivos, você pode usar globbing para fazer com que seu shell expanda os nomes dos arquivos.

convert -resize 50% -delay 10 -loop 0 image_{0..99}.jpg output.gif
shanksk
fonte
11

GIMP

Você pode fazer isso facilmente com o GIMP. Primeiro instale-o se ainda não estiver instalado com

sudo apt-get install gimp

Criando o gif

No GIMP, vá em Arquivo -> Abrir como camadas para abrir todos os pngs em sua própria camada.

Abrir como camada

A partir daqui, você pode executar edições nas camadas e, uma vez feito, vá para Arquivo -> Exportar como . Na caixa de diálogo, defina o tipo de arquivo como GIF.

Defina o tipo de arquivo como GIF

A partir daí, você acessará as opções de exportação de GIF. Marque a opção ' Como animação ' e defina os parâmetros conforme necessário.

Opções de exportação de GIF

chesedo
fonte
7

solução ffmeg + dados de teste

No Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8, eu descobri que o ffmpeg é muito mais rápido e usa muito menos memória .

O comando de conversão mais simples é:

ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i '*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.gif \
;

Você pode obter meus dados de teste com:

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle

Os dados de teste foram gerados com: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292 e contém 256 imagens 1024x1024 PNG.

E aqui estão outros dados de teste que você pode gerar diretamente no seu navegador agora mesmo! https://stackoverflow.com/questions/19235286/convert-html5-canvas-sequence-to-a-video-file/57153718#57153718

insira a descrição da imagem aqui

As ffmpegopções importantes que quero destacar são:

  • -pattern_type glob: maneira conveniente de selecionar imagens

  • -framerate 60: assume 60 FPS nas imagens de entrada e gera o mesmo FPS.

    ffmpeg não pode saber de outra maneira, pois não há dados de FPS nas imagens e nos formatos de vídeo.

    Os 256 quadros de entrada levam cerca de 4 segundos para terminar.

    -r 15: opcional. Escolha uma a cada 4 imagens para reduzir o tamanho ( 4 == 60 / 15).

    Com isso, identify out.gifdiz que o GIF contém apenas 64 quadros.

    Ainda demora 4 segundos para jogar, então o atraso é alterado para fazer as coisas coincidirem.

  • -vf scale=512:-1: opcional. Defina a largura, a altura da escala proporcionalmente, geralmente para reduzir o tamanho e economizar espaço.

Para que o ImageMagick funcionasse, primeiro tive que modificar seus limites de disco e memória, /etc/ImageMagick-6/policy.xmlconforme explicado em: https://superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages

Veja também:

ImageMagick vs ffmpeg benchmark

Eu comparei os comandos:

/usr/bin/time -v convert *.png -deconstruct -delay 1.6 out-convert.gif
/usr/bin/time -v ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i '*.png' \
  out-ffmpeg.gif \
;

Os comandos foram construídos para produzir saídas o mais próximo possível para validar a comparação:

  • /usr/bin/time -v: usado para encontrar o uso máximo de memória, conforme explicado em: https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process

  • -deconstruct: As imagens GIF podem conter apenas o retângulo mínimo modificado do quadro anterior para diminuir o GIF.

    ffmpegcalcula essas diferenças por padrão, mas o ImageMagick não, a menos que -deconstructseja usado.

    Basicamente, você deseja usar essa opção todas as vezes com o ImageMagick.

    Podemos observar a diferença com:

    identify out.gif
    

    Com a versão compactada, todos os quadros têm tamanhos menores que o inicial, por exemplo:

    out.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    out.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    out.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    

    Neste exemplo, o segundo quadro é apenas em 516x516vez dos 1024x1024 completos e é colocado em um deslocamento de 252+257. Portanto, contém apenas o triângulo do meio.

    Consulte também: como redimensionar um arquivo GIF animado usando o ImageMagick?

  • -delay: valor que corresponde aos 60FPS de ffmpeg. Não deve importar para o desempenho da conversão, mas não quero arriscar.

Os GIFs de saída têm aproximadamente o mesmo tamanho e parecem visualmente idênticos.

Chegamos ao ImageMagick:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:56.16
Maximum resident set size (kbytes): 2676856

e para ffmpeg:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.41
Maximum resident set size (kbytes): 97172

a partir do qual vemos que:

  • O ImageMagick usou 2,6 Gb de RAM e levou cerca de 1 minuto
  • O ffmpeg usou 100Mb de RAM e levou 4 segundos

Hardware de teste: laptop Lenovo ThinkPad P51 , Intel Core i7-7820HQ, 32 GB (16 + 16) DDR4 2400 MHz SODIMM, 512 GB SSD PCIe TLC OPAL2.

Ciro Santilli adicionou uma nova foto
fonte
Votado e gostei !, ótima resposta, tenho uma pequena pergunta de acompanhamento. Não tenho muitas imagens de alta qualidade e não usei -r nem -vcomandos, mas o gif de saída é de qualidade muito inferior aos arquivos png originais. Como manter a mesma qualidade de gif que os arquivos png fornecidos?
astro123 10/04
Oi @ astro123 como é a qualidade mais baixa? Tamanho de imagem menor, menos quadros ou outra coisa (o GIF parece sem perdas, portanto, não pode haver pior compactação)? Tente -framerate 60 -r 60. Inspecione o GIF gerado e as imagens de entrada com as ferramentas ImageMagick, identifypara tentar descobrir o que está acontecendo.
Ciro Santilli escreveu: 10/04
4

Você pode usar um programa chamado convert incluído no pacote imagemagick. É orientado por linha de comando, mas muito fácil de usar. Instale-o pelo centro de software ou acesse um prompt de comando e digite

sudo apt-get install imagemagick

Agora, para criar o .gif.

convert -delay 100  -size 100x100 xc:SkyBlue \
          -page +5+10  balloon.gif   -page +35+30 medical.gif  \
          -page +62+50 present.gif   -page +10+55 shading.gif  \
          -loop 0  animation.gif

* Observe que o exemplo acima é direto dos Exemplos de imagens mágicas

Scott Goodgame
fonte
1
Como faço para 40 imagens PNG em um GIF em loop? Tudo na pasta / home / fusion809 / Documentos / Imagens
BH2017
1
@ BH2017: cria convert -delay 20 -loop 0 *.png out.gifum GIF em loop.
unutbu