2011-10-27 20 views
15

Estoy creando un prototipo de procesador de imagen en Python 2.7 utilizando PIL1.1.7 y me gustaría que todas las imágenes terminen en JPG. Los tipos de archivos de entrada incluirán tiff, gif, png ambos con transparencia y sin. He intentado combinar dos scripts que encontré que 1. convertir otros tipos de archivos a JPG y 2. eliminar la transparencia creando una imagen en blanco y pegando la imagen original sobre el fondo blanco. Mis búsquedas se envían por correo electrónico con personas que buscan generar o preservar la transparencia en lugar de lo contrario.PIL Convertir PNG o GIF con transparencia a JPG sin

Actualmente estoy trabajando con esto:

#!/usr/bin/python 
import os, glob 
import Image 

images = glob.glob("*.png")+glob.glob("*.gif") 

for infile in images: 
    f, e = os.path.splitext(infile) 
    outfile = f + ".jpg" 
    if infile != outfile: 
     #try: 
     im = Image.open(infile) 
     # Create a new image with a solid color 
     background = Image.new('RGBA', im.size, (255, 255, 255)) 
     # Paste the image on top of the background 
     background.paste(im, im) 
     #I suspect that the problem is the line below 
     im = background.convert('RGB').convert('P', palette=Image.ADAPTIVE) 
     im.save(outfile) 
     #except IOError: 
      # print "cannot convert", infile 

Ambas secuencias de comandos funcionan de forma aislada, sino como los he combinado Puedo obtener un ValueError: Bad máscara de transparencia.

Traceback (most recent call last): 
File "pilhello.py", line 17, in <module> 
background.paste(im, im) 
File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1101, in paste 
self.im.paste(im, box, mask.im) 
ValueError: bad transparency mask 

Sospecho que si tuviera que guardar un png sin la transparencia que pude y luego abrir ese archivo nuevo, y volver a guardarlo como un archivo JPG, PNG y elimino el que fue escrito en el disco, pero estoy esperando que haya una solución elegante que aún no he encontrado.

+0

¿Por qué se puede esperar que el problema es la "línea de abajo" cuando el código se Barfing en el '.paste()' y ni siquiera llegar a esa línea? – kindall

Respuesta

28

RGB Haga su fondo, no RGBA. Y elimine la conversión posterior del fondo a RGB, por supuesto, ya que ya está en ese modo. Esto funcionó para mí una imagen de prueba que creé con:

from PIL import Image 
im = Image.open(r"C:\jk.png") 
bg = Image.new("RGB", im.size, (255,255,255)) 
bg.paste(im,im) 
bg.save(r"C:\jk2.jpg") 
+4

No funciona en http://img293.imageshack.us/img293/1434/teslahv5.png, ¿qué puedo hacer para solucionarlo? –

+0

Creo que la línea bg.paste (im, im) debe ser bg.paste (im, máscara = im) – Ramast

+2

Got '*** ValueError: máscara de transparencia incorrecta' para mask = im – Sandeep

4

las siguientes obras para mí en this image

f, e = os.path.splitext(infile) 
print infile 
outfile = f + ".jpg" 
if infile != outfile: 
    im = Image.open(infile) 
    im.convert('RGB').save(outfile, 'JPEG') 
+0

Intenté este enfoque al principio. Simplemente convirtiendo directamente al modo RGB funciona con una máscara de bordes duros, pero puede fallar bastante desagradable con una máscara de bordes suaves. – kindall

+0

¿Puede proporcionar un enlace a una imagen donde falla? Puedo ver si puedo hacer que funcione – uncreative

+0

[Aquí está el que] (http://mac.jerrykindall.com:81/pil/jk.png) hice para jugar con esto. Y [aquí está el resultado] (http://mac.jerrykindall.com:81/pil/jk_bad.png) de simplemente quitar el canal alfa. – kindall

7
image=Image.open('file.png') 
non_transparent=Image.new('RGBA',image.size,(255,255,255,255)) 
non_transparent.paste(image,(0,0),image) 

La clave es hacer que la máscara (para la pasta) la imagen en sí.

Esto debería funcionar en esas imágenes que tienen "bordes suaves" (donde la transparencia alfa está configurado para no ser 0 o 255)