Como converter uma faixa de PNG para GIF?

12

Então, eu fiz essa animação em um programa, no entanto, parece não suportar a exportação como uma sequência PNG, para que eu possa convertê-la em um GIF. A animação tem mais de 100 quadros, portanto, salvar cada imagem um por um levará séculos. No entanto, ele suporta a exportação como uma "tira", que é como um filme. Cada imagem na animação tem as mesmas dimensões. Veja como o recurso "faixa" do programa funciona.

As imagens na animação são empilhadas horizontalmente, o primeiro quadro fica na extrema esquerda e o último quadro na extrema direita. Não há espaços entre os quadros, e o nome do arquivo geralmente é "name_stripX.png" se a animação tiver X quadros. Se cada quadro tivesse 32 por 32 e a animação tivesse 8 quadros, esse arquivo teria uma largura de 256 e uma altura de 32.

Aqui está um exemplo de saída, cada cor preenche um quadro:

Saída de exemplo

Além disso, apenas para esclarecer um pouco mais, o programa se chama "Game Maker 8.0".

user245115
fonte

Respostas:

16

Você pode usar o ImageMagick para converter imagens de várias maneiras, e deve ser capaz disso com bastante facilidade. Primeiro, você pode dividir em partes ( original.pngsendo a imagem de origem e, neste caso, 32 x 32 pixels em tamanho):

convert original.png -crop 32x32 parts-%02d.png

Você pode convertê-lo em uma animação (use -loop 1se você não quiser fazer um loop):

convert -loop 0 -page +0+0 ./parts*.png output.gif

Resultando em:

Os PNGs de saída do primeiro comando têm um deslocamento incluído; portanto, sem a -page +0+0opção, a animação acaba como:

Existem várias outras opções que você pode incluir (principalmente no segundo comando), como -delayetc - você também pode otimizar a animação para que ela seja menor (e mais rápida para carregar / renderizar) - por exemplo, emprestada a partir daqui :

convert output.gif -fuzz 10% -layers Optimize optimised.gif

ou usando gifsicle

gifsicle -O output.gif -o optimised.gif

EDIT: Se os quadros forem transparentes, você poderá definir os quadros a serem substituídos adicionando a
-dispose Backgroundopção, portanto, quando um quadro for descartado quando o próximo for carregado:


Exemplo acima feito sem a pageopção para mostrar claramente

O problema é que você provavelmente não pode otimizar muito a imagem resultante - então outra maneira pode ser tornar os quadros opacos para que o próximo quadro cubra o anterior.

Wilf
fonte
A imagem tem transparência, e basicamente é apenas desenhar o próximo quadro sobre o anterior, existe alguma maneira de fazê-lo para desenhar o próximo quadro em branco?
user245115
Remover a transparência da imagem de origem é o método mais fácil. Mas isso pode ser feito com mais parâmetros.
David6
@ user245115 - substitua os quadros em vez de sobrepor - consulte editar.
Wilf