Criando uma animação GIF a partir de arquivos PNG

83

Existe uma ferramenta para criar uma gifanimação a partir de um conjunto de pngarquivos?

Eu tentei o convertcomando do ImageMagick , mas isso nem sempre é bem-sucedido. Além disso, tenho vários problemas com isso:

  1. Não sei dizer qual é o progresso.
  2. Não importa o que eu tente, a -delaybandeira não altera a taxa de quadros da animação gif.
  3. convertdetermina a ordem dos quadros com base na ordem alfabética dos nomes dos arquivos. Isso significa que name500.pngserá colocado logo após name50.pnge não depois que name450.pngeu puder corrigir isso adicionando 0, mas isso é irritante.
Yotam
fonte
[Notícias] Há uma enorme sobreposição entre o Ubuntu Stackexchange e o Unix Stackexchange. Eu tentei categorizar alguns tópicos aqui .
hhh
Em relação ao item 3., você ainda pode usá-lo convertapós classificar os arquivos. Provavelmente, algo como isso funcionafiles=$(ls name*png | sort -n -tname -k1); convert $files animation.gif
altroware
Para o ponto 1: convert possui um -monitorparâmetro que rastreia o processo
Curlew

Respostas:

50

As versões mais recentes do ffmpeg não têm -sameq ( consulte as perguntas frequentes ), mas têm suporte para GIF.

ffmpeg -i %03d.png output.gif

Onde% 03d é o ID do quadro em 3 dígitos.

Você também pode tentar usar ffmpegpara criar um filme a partir de uma sequência de imagens e depois converter o filme em uma animação GIF (novamente usando ffmpeg).

# cf. http://pages.uoregon.edu/noeckel/MakeMovie.html

# first convert an image sequence to a movie
ffmpeg -sameq -i %03d.jpg output.mp4

# ... and then convert the movie to a GIF animation
ffmpeg -i output.mp4 -pix_fmt rgb24 -s qcif -loop_output 0 output.gif
nano
fonte
10
Esta instrução está desatualizada.
highmaintenance
3
A sameqopção não está mais disponível. Além disso, para mim, isso substitui os arquivos de imagem originais e não produz um arquivo de filme válido.
Lode
Qual é o sentido de deixar o -sameqcódigo lá? Por que você gostaria de usar um formato de vídeo com perdas ( output.mp4) como temporário? E se sim, por que "mesma qualidade" que a entrada, em vez de uma taxa de bits muito alta? Artefatos disso apenas pioram as coisas para o codificador GIF. Se você precisava usar um vídeo temporariamente, gostaria de usar algo sem perdas, como o huffyuv. Ou MJPEG sem transcodificação, apenas remova os jpegs de entrada em um MJPEG. ( -codec:video copy)
Peter Cordes
80

converté uma ferramenta útil de linha de comando para fazer isso. cdpara a pasta que contém seus arquivos png e execute este comando:

convert -delay 10 -loop 0 *.png animation.gif

Fonte: http://ubuntuforums.org/showthread.php?t=1132058

RobinJ
fonte
5
A pergunta menciona converte alguns problemas ao usá-lo. Sua resposta não aborda nenhuma delas.
Mat
3
A partir da versão do ImageMagick, 6.8.7-4 2013-11-02 Q16isso funcionou para mim.
Rudy Matela
7
Isso funciona, mas 10significa 10 * 10ms, muito rápido. Um atraso de a 100é de 1 segundo.
Anne van Rossum
7
usar a opção -dispose previousou -dispose 2se você estiver trabalhando com PNGs transparentes
Haiphong
4
nota para mim: expansão cinta pode ser útil para especificar a lista de imagens como argumentos, por exemplo pic_{0..20..2}.pngexpande para pic_0.png, pic_2.pngtodo o caminho atépic_20.png
Yibo Yang
19

A opção convert's --delayse aplica apenas à próxima imagem na linha de comando. Então convert -delay 10 *, apenas definirá o atraso do primeiro quadro para 0,1 segundo. A opção precisa ser repetida:

convert $(for a in *; do printf -- "-delay 10 %s " $a; done; ) result.gif

Para sua necessidade de classificação, o convert não classifica quadros, o shell globing *sim. Se você souber que seus quadros estão numerados de 0 a 700, basta calcular os números você mesmo:

convert $(for ((a=0; a<700; a++)); do printf -- "-delay 10 name%s.png " $a; done;) result.gif
BatchyX
fonte
5
Eu não experimento esse comportamento com convert, para mim convert -delay 1000 -loop 0 *.png animation.gifadiciona um atraso de 10 segundos entre cada imagem.
Lode
1
Você também pode usar o tipo de versão do lscomando. Ou seja:convert -delay 1000 $(ls -v name*png) output.gif
erik
7

Atualizar:

Use convertpara o png-para-gif e use o gifsicle para a animação. Não é uma solução do One App To Do It All, mas com script, com certeza.


O GIMP pode criar gifs animados e fornece controle de tempo / atraso e repetição, etc.

gregnotcraig
fonte
3
Eu sei sobre o gimp, mas não sei como escrevê-lo. Além disso, o usando o GIMP para criar a animação é como matar uma mosca com um canhão
Yotam
1
Essa é uma péssima ideia; a qualidade será horrível, pois cada quadro será quantizado separadamente.
Clément
2

O ImageMagick pode gerar uma animação gif de boa qualidade. Confira este vídeo - http://www.youtube.com/watch?v=OFusYizJ-bA

xyz
fonte
6
Bem-vindo ao Unix e Linux! Geralmente, gostamos de respostas no site para poder se manter por conta própria - os links são ótimos, mas se esse link quebrar, a resposta deve ter informações suficientes para continuar sendo útil. Considere editar sua resposta para incluir mais detalhes. Veja o FAQ para mais informações.
Slm
O que é um comentário útil acima ....
Luke
convert -delay 200 -loop 0 *.jpg output.gif
Lucas
2

ffmeg opções GIF importantes + dados de teste

Para complementar esta resposta :

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
ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i 'tmp.*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.gif \
;

Os dados de teste foram gerados com: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

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

  • -patter_type glob: maneira conveniente de selecionar imagens
  • -framerate 60e -r 15: assuma 60 FPS nas imagens de entrada ( ffmpegnão é possível saber o contrário, pois não há dados de FPS nas imagens e nos formatos de vídeo), escolha uma a cada 4 imagens para reduzir o tamanho ( 4 == 60 / 15)
  • -vf scale=512:-1: defina a largura, a altura da escala proporcionalmente, geralmente para reduzir o tamanho e economizar espaço

Veja também:

Testado no Ubuntu 18.10, ffmpeg 4.0.2.

Ciro Santilli adicionou uma nova foto
fonte
-1

No que diz respeito ao ponto 2

A versão do "display" do ImageMagick que tenho (ImageMagick 6.7.2-7 2017-01-12) ignora a taxa de quadros definida usando o comando convert para produzir o gif animado. Tente outro programa para visualizar o gif animado como o Firefox.

user8388891
fonte