me trató de convertir un gif para imágenes individuales con Python biblioteca de imágenes, pero da lugar a tramas extrañasPIL - Convertir Marcos GIF a JPG
El GIF de entrada es:
Source Image http://longcat.de/gif_example.gif
En mi primer intento, traté de convertir la imagen con Image.new en una imagen RGB , con 255,255,255 como fondo blanco, como en cualquier otro ejemplo de que he encontrado en Internet:
def processImage(infile):
try:
im = Image.open(infile)
except IOError:
print "Cant load", infile
sys.exit(1)
i = 0
try:
while 1:
background = Image.new("RGB", im.size, (255, 255, 255))
background.paste(im)
background.save('foo'+str(i)+'.jpg', 'JPEG', quality=80)
i += 1
im.seek(im.tell() + 1)
except EOFError:
pass # end of sequence
pero resulta en archivos de salida extraños:
Example #1 http://longcat.de/gif_example1.jpg
Mi segundo intento fue, para convertir el gif en una RGBA primero, y luego usar su máscara de transparencia, para hacer las piezas transparentes blanco:
def processImage(infile):
try:
im = Image.open(infile)
except IOError:
print "Cant load", infile
sys.exit(1)
i = 0
try:
while 1:
im2 = im.convert('RGBA')
im2.load()
background = Image.new("RGB", im2.size, (255, 255, 255))
background.paste(im2, mask = im2.split()[3])
background.save('foo'+str(i)+'.jpg', 'JPEG', quality=80)
i += 1
im.seek(im.tell() + 1)
except EOFError:
pass # end of sequence
que se traduce en una salida como esta:
Example #2 http://longcat.de/gif_example2.jpg
La ventaja sobre el primer intento fue, que el primer cuadro se ve muy bien Pero como se puede ver, el resto se divide
¿Qué debería probar la próxima?
Editar:
Creo que me encontré mucho más cerca de la solución
Example #3 http://longcat.de/gif_example3.png
tuve que usar la paleta de la primera imagen para las otras imágenes, y fusionarla con la fotograma anterior (para animaciones gif que utilizan diff-imágenes)
def processImage(infile):
try:
im = Image.open(infile)
except IOError:
print "Cant load", infile
sys.exit(1)
i = 0
size = im.size
lastframe = im.convert('RGBA')
mypalette = im.getpalette()
try:
while 1:
im2 = im.copy()
im2.putpalette(mypalette)
background = Image.new("RGB", size, (255,255,255))
background.paste(lastframe)
background.paste(im2)
background.save('foo'+str(i)+'.png', 'PNG', quality=80)
lastframe = background
i += 1
im.seek(im.tell() + 1)
except EOFError:
pass # end of sequence
Pero i ac tualmente dont know, por qué mi transparencia es negro, en lugar de blanco Incluso si modifico la paleta (cambiar el canal de transparencia a blanco) o uso la máscara de transparencia, el fondo sigue siendo negro
Muchas gracias! Uso pasta con el último fotograma, porque algunos gifs usan diffs para cada fotograma! – Schinken
Uhm, reemplazar la paleta de esa manera dará resultados incorrectos cuando los marcos tengan diferentes paletas. Un ejemplo de esa es la imagen http://www.imagemagick.org/Usage/anim_opt/bunny_bgnd.gif (creo que no estoy seguro si estoy copiando y pegando los enlaces correctos). El otro problema que veo podría estar relacionado con las diferencias entre las versiones de PIL, pero no obtengo el mismo resultado que el tuyo (obtengo áreas grises en todos los marcos excepto en el primero, donde debería haber sido transparente). Lo mismo ocurre con un gif como http://www.imagemagick.org/Usage/anim_opt/bunny_bgnd_opttrans.gif. – mmgp
@mmgp - hmm, sí Puedo ver que los marcos con diferentes paletas pueden suponer un problema. Estoy de acuerdo en que obtener resultados diferentes podría ser un problema de versión. Desafortunadamente, no tengo tiempo para ver esto en este momento; si tienes una solución, edita mi respuesta o agrega la tuya. Buena esa. – fraxel