quarta-feira, 21 de março de 2012

Python e GIFs animados

Trabalhando em um projeto precisei criar arquivos de imagens. Tudo ocorria bem até eu me deparar com um problema: Como criar uma imagem animada transparente?

O PIL não cria GIF's animados, apenas os lê.

Achei então um image2gif escrito por Almar Klein mas o script dele não cria GIF's com transparência.

Procurei formas alternativas usando o PIL como base e não achei nada, mas achei um código escrito em PHP por László Zsidi muito bom que faz exatamente o que estava procurando. Transcrevi o código pra Python e o resultado encontrasse abaixo para uso.

A classe trabalha com arquivos GIF da versão 87a e 89a. A dimensão final da imagem é baseada no primeiro frame.

GIF(frames, loops=0, dis=2, transparency=None)

frames
uma tupla com os frames onde o primeiro indice é o arquivo e o segundo indíce é o tempo do frame, o arquivo pode ser um open(..., 'rb'),  caminho do arquivo relativo ou absoluto, ou uma string contendo o a imagem.
 
loops
Quantidade de repetições da animação, onde 0 é repetição contínua.
 
dis
Disposição de cada frame. Onde 0, 1 uma imagem é jogada em cima da outra respeitando a transparência. E 2, 3 o efeito cascata não é aplicado.
 
transparency
Cor que será considera a cor alpha da imagem, dando o efeito de transparência.

GIF.create_animation()

Retorna um buffer contendo a imagem GIF animada.

Exemplo

from GIF import GIF
frames = [
    (open('410.gif', 'rb').read(), 40),
    (open('411.gif', 'rb'), 40),
    ('412.gif', 40),
    (open('413.gif', 'rb'), 40),
    (open('414.gif', 'rb'), 40),
    (open('415.gif', 'rb'), 40),
    (open('416.gif', 'rb'), 40),
    (open('417.gif', 'rb'), 40),
]
gif = GIF(frames, 2, 3, (255, 0, 255))
image = gif.create_animation() # retorna o buffer da imagem
open('animation.gif', 'w+b').write(image)    

Download

GIF.7z (Python, 5kb)
  • GIF.py -- módulo
  • 410.gif ~ 417.gif -- imagens de exemplo
  • animationjoin.gif -- imagem de resultado final
GIFEncoder.zip (PHP, 41kb) escrito por László Zsidi

Att, Gilson Fabiano

Nenhum comentário:

Postar um comentário