Quero fazer uma .gif
imagem animada a partir de um determinado conjunto de .jpg
fotos.
Eu preferiria fazê-lo na linha de comando, portanto, as ferramentas de linha de comando seriam muito bem-vindas.
Quero fazer uma .gif
imagem animada a partir de um determinado conjunto de .jpg
fotos.
Eu preferiria fazê-lo na linha de comando, portanto, as ferramentas de linha de comando seriam muito bem-vindas.
Respostas:
Você pode usar o pacote ImageMagick . Instale-o usando o comando:
sudo apt-get install imagemagick
Agora você pode criar um gif
número de imagens ( jpg
) usando:
convert -delay 20 -loop 0 *.jpg myimage.gif
-resize 50%
.
-deconstruct
. Eu também descobri que ImageMagick é muito memória com fome, ver benchmarks: askubuntu.com/a/1102183/52975
convert -delay 0 -loop 0 *.tif myanimated.gif
funcionou bem, em 720 arquivos tif
Para concluir a resposta do @Maythux:
-resize
opçã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
*.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 -t
por exemplo. No ubuntu, você pode usar ls -v
algo 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.
find
, sort
, a expansão cinta, e assim por diante. A ls
ferramenta é notoriamente inadequada para esse tipo de coisa. Use find
. Há um pouco de uma curva de aprendizado, mas vale a pena.
Você pode fazer isso facilmente com o GIMP. Primeiro instale-o se ainda não estiver instalado com
sudo apt-get install gimp
No GIMP, vá em Arquivo -> Abrir como camadas para abrir todos os pngs em sua própria 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.
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.
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
As ffmpeg
opçõ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.gif
diz 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.xml
conforme 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.
ffmpeg
calcula essas diferenças por padrão, mas o ImageMagick não, a menos que -deconstruct
seja 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 516x516
vez 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:
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.
-r
nem -v
comandos, 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?
-framerate 60 -r 60
. Inspecione o GIF gerado e as imagens de entrada com as ferramentas ImageMagick, identify
para tentar descobrir o que está acontecendo.
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
convert -delay 20 -loop 0 *.png out.gif
um GIF em loop.