2011-02-05 29 views
10

Soy muy nuevo en Python, tratando de usarlo para dividir los marcos de un GIF en imágenes PNG.Python: Conversión de marcos GIF a PNG

# Using this GIF: http://www.videogamesprites.net/FinalFantasy1/Party/Before/Fighter-Front.gif 

from PIL import Image 

im = Image.open('Fighter-Front.gif') 
transparency = im.info['transparency'] 
im.save('test1.png', transparency=transparency) 

im.seek(im.tell()+1) 
transparency = im.info['transparency'] 
im.save('test2.png', transparency=transparency) 

# First frame comes out perfect, second frame (test2.png) comes out black, 
# but in the "right shape", i.e. 
# http://i.stack.imgur.com/5GvzC.png 

¿Esto es específico de la imagen con la que estoy trabajando o estoy haciendo algo mal?

Gracias!

Respuesta

14

No creo que estés haciendo nada mal. Vea un problema similar aquí: animated GIF problem. Parece que la información de la paleta no se trata correctamente para los cuadros posteriores. Las siguientes obras para mí:

def iter_frames(im): 
    try: 
     i= 0 
     while 1: 
      im.seek(i) 
      imframe = im.copy() 
      if i == 0: 
       palette = imframe.getpalette() 
      else: 
       imframe.putpalette(palette) 
      yield imframe 
      i += 1 
    except EOFError: 
     pass 

for i, frame in enumerate(iter_frames(im)): 
    frame.save('test%d.png' % i,**frame.info) 
+0

¡Brillante, funciona perfectamente, gracias! – Joseph

4

He arreglado este error aquí https://code.launchpad.net/~asdfghjkl-deactivatedaccount1/python-imaging/gif-fix.

La respuesta de DSM no funcionará si el GIF usa tablas de colores locales.

+0

De hecho, reemplazar la paleta como se hace en la respuesta aceptada es algo muy incorrecto de hacer. Pero, sin la necesidad de aplicar un parche, ¿es solo cuestión si se comprueba 'frame.palette.dirty' para decidir entre colocar la paleta" inicial "? – mmgp

+0

¿Puedes enviar una solicitud de extracción a Pillow para esto? https://github.com/python-imaging/Pillow/issues/312#issuecomment-21852418 – aclark

Cuestiones relacionadas