2011-10-27 20 views
15

Sto prototipando un processore di immagini in Python 2.7 utilizzando PIL1.1.7 e vorrei che tutte le immagini finissero in JPG. I tipi di file di input includeranno tiff, gif, png sia con trasparenza che senza. Ho cercato di combinare due script che ho trovato che 1. convertire altri tipi di file in JPG e 2. rimuovere la trasparenza creando un'immagine bianca vuota e incollando l'immagine originale su uno sfondo bianco. Le mie ricerche vengono spammate con persone che cercano di generare o preservare la trasparenza piuttosto che il contrario.PIL Converti PNG o GIF con trasparenza in JPG senza

Attualmente sto lavorando con questo:

#!/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 

Entrambi gli script funzionano in modo isolato, ma come li ho combinato io ottenere un ValueError: Bad maschera di trasparenza.

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 

Ho il sospetto che se dovessi salvare un PNG senza trasparenza potevo quindi aprire tale nuovo file, e ri-salvarlo come JPG, ed eliminare i PNG che è stato scritto su disco, ma sono sperando che ci sia una soluzione elegante che non ho ancora trovato.

+0

Perché si aspettano che il problema è la "linea sotto" quando il codice viene barfing su '.paste()' e non arrivando nemmeno a quella linea? – kindall

risposta

28

lasciati RGB sfondo, non RGBA. E rimuovere la successiva conversione dello sfondo in RGB, ovviamente, poiché è già in quella modalità. Questo ha funzionato per me un'immagine di prova che ho creato 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

Non funziona su http://img293.imageshack.us/img293/1434/teslahv5.png, cosa posso fare per risolverlo? –

+0

Penso che la riga bg.paste (im, im) deve essere bg.paste (im, mask = im) – Ramast

+2

Ottenuta '*** ValoreErrore: maschera di cattiva trasparenza' per mask = im – Sandeep

4

le seguenti opere per me su 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

Ho provato questo approccio all'inizio. La semplice conversione diretta in modalità RGB funziona con una maschera con bordi netti, ma può fallire in modo piuttosto brutto con una maschera con bordi morbidi. – kindall

+0

Puoi fornire un link a un'immagine dove fallisce? Posso vedere se riesco a farlo funzionare – uncreative

+0

[Ecco quello] (http://mac.jerrykindall.com:81/pil/jk.png) l'ho fatto per giocare con questo. E [ecco il risultato] (http://mac.jerrykindall.com:81/pil/jk_bad.png) di appena togliere il canale 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 chiave è quello di rendere la maschera (per la pasta) l'immagine stessa.

Questo dovrebbe funzionare su quelle immagini che hanno "bordi morbidi" (dove la trasparenza alfa è impostato per non essere 0 o 255)