Converte milhares de .pngs em .gif animado, 'convert' usa muita memória

21

Muitas das perguntas perguntando como criar < um href="https://sobrelinux.info/questions/103482/how-can-i-create-a-gif-out-of-a-sequence-of-png-files-without-the-previous-image" > um gif animado de um conjunto of png images sugiro use uma variante do comando convert do ImageMagick:

convert -delay 2 -loop 0 *.png animated.gif

No entanto, tenho alguns milhares de imagens e, portanto, convert consome toda a minha memória, troca e depois falha. Que software alternativo existe, que é mais consciente da memória? Eu poderia usar outro formato aberto se .gif não for suportado e eu prefiro uma ferramenta CLI.

    
por dotancohen 14.01.2015 / 14:38

7 respostas

26

Parece que você está tentando fazer um vídeo. Se for esse o caso, eu usaria um formato de vídeo adequado.

Nesse caso, eu usaria o ffmpeg para converter os arquivos PNG individuais em um vídeo H.264. Como o ffmpeg é feito para trabalhar com vídeos que podem durar horas, ele não deve ter nenhum problema com milhares de imagens. Usar H.264 em vez de gif animado resultará em uma melhoria vasta na qualidade da imagem.

Algo como isso deve funcionar para você:

 ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4
  • -framerate 1/2 : define a taxa de quadros como metade de FPS ou 2 segundos por quadro.
  • -i img%04d.png : Isso diz ao ffmpeg para ler os arquivos img0000.png , embora img9999.png .
  • -c:v libx264 : use o codec de vídeo libx264.
    • Você pode especificar os parâmetros de compactação de vídeo aqui, se desejar:
    • -crf <number> : configuração de qualidade. 0 a 51. 23 é o padrão. 0 é uma verdadeira codificação sem perda, que será uma largura de banda bastante alta. 18 é quase visualmente sem perdas.
  • -r 30 : defina a taxa de quadros de saída para 30 FPS. Cada uma das imagens de entrada será duplicada para tornar a saída o que você especificar aqui. Você pode deixar esse parâmetro desativado e o arquivo de saída estará no framerate de entrada, mas o filme resultante não foi exibido corretamente quando tentei agora.
  • out.mp4 : nome do arquivo de saída.

Referências:

por David Yaw 15.01.2015 / 03:36
10

Pessoalmente, gostaria de lançá-lo em um número limitado de arquivos em vez de todos de uma vez. Por exemplo, algo assim:

#!/usr/bin/env bash

## Collect all png files in the files array
files=( *png )
## How many should be done at once
batch=50

## Read the array in batches of $batch
for (( i=0; $i<${#files[@]}; i+=$batch ))
do
    ## Convert this batch
    convert -delay 2 -loop 0 "${files[@]:$i:$batch}" animated.$i.gif
done

## Now, merge them into a single file
convert  animated.*.gif all.gif
    
por terdon 14.01.2015 / 15:42
7

Use -limit memory 1GiB para limitar a quantidade de memória convert usa.

Milhares de imagens criariam um enorme GIF que a maioria dos computadores teria dificuldade em exibir. Eu mantenho meus GIFs animados abaixo de 200 imagens quando possível. Quanto menos, melhor. Se você numerar suas imagens, esse comando excluirá as imagens ímpares rm *[13579].png .

Então, aqui está meu fluxo de trabalho típico para criar um GIF animado a partir de uma cena de filme:

avconv -ss 00:26:00 -i someMovie.mpg %5d.png
rm  *[13579].png
convert -limit memory 1GiB -loop 0 -layers optimize -resize 400 *.png output.gif
    
por PLA 20.01.2015 / 19:59
3

Se você tem milhares de png-s, o formato anigif é estranho. Eu faria assim, usando avconv :

 avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov
    
por Frantique 14.01.2015 / 14:55
3
  

Eu poderia usar outro formato aberto se .gif não for compatível

Talvez o APNG seja útil para você. É suportado por alguns navegadores , incluindo o Firefox, mas no momento excluindo o Chrome e o IE. Uma vez que é apenas uma extensão PNG, é muito simples converter PNGs para APNG. A ferramenta apngasm pode fazer isso. Mas o formato é tão simples que recentemente escrevi uma assembler APNG para o Sage. Adaptar esse código seria uma alternativa.

    
por MvG 14.01.2015 / 17:27
2

Além de outras respostas: como você deseja produzir um arquivo GIF, presumo que queira exibir a imagem em uma página da web. Se assim for, eu não me incomodaria em converter seus PNGs. Basta google para "slideshow javascript" e usar um dos milhões de scripts gratuitos. Ou escreva o seu próprio, isso é realmente trivial.

Os benefícios de se fazer isso são:

  • apenas uma imagem é carregada no navegador a qualquer momento, a apresentação de slides é iniciada rapidamente e não consome muita memória RAM na máquina do usuário.

  • a solução é dimensionada para milhões de imagens. Ou bilhões, se você for paciente o suficiente para assisti-los todos:)

  • Você pode adicionar controles à sua página para pausar, retroceder, alterar o atraso ou ir para um quadro específico.

por Sergey 20.01.2015 / 22:01
1
O

gifsicle é um utilitário de linha de comando para lidar com animações GIF. Se você está disposto a trocar memória por velocidade, você pode usar o seu switch de memória --conserve.

    
por codehead 15.01.2015 / 03:13