2011-10-27 6 views
15

Je suis en train de prototyper un processeur d'image en Python 2.7 en utilisant PIL1.1.7 et je voudrais que toutes les images se retrouvent au format JPG. Les types de fichiers d'entrée incluront tiff, gif, png avec ou sans transparence. J'ai essayé de combiner deux scripts que j'ai trouvés: 1. convertir d'autres types de fichiers en JPG et 2. supprimer la transparence en créant une image blanche vierge et coller l'image originale sur le fond blanc. Mes recherches sont spammées avec des gens qui cherchent à générer ou préserver la transparence plutôt que le contraire.PIL Convertir PNG ou GIF avec transparence en JPG sans

Je travaille actuellement avec ceci:

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

Les deux scripts fonctionnent en vase clos, mais comme je les ai-je obtenir un combiné ValueError: Mask Bad transparence.

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 

Je pense que si je devais enregistrer un PNG sans transparence, je pourrais alors ouvrir ce nouveau fichier, et ré-enregistrer en tant que JPG, et supprimer le PNG qui a été écrit sur le disque, mais je suis En espérant qu'il existe une solution élégante que je n'ai pas encore trouvée.

+0

Pourquoi penseriez-vous le problème est lorsque le code est Barfing sur le '.paste()' et ne pas même arriver à cette ligne? – kindall

Répondre

28

Faire votre RVB d'arrière-plan, pas RGBA. Et supprimer la conversion ultérieure de l'arrière-plan en RVB, bien sûr, car il est déjà dans ce mode. Cela a fonctionné pour moi avec une image test j'ai créé:

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

Il échoue sur http://img293.imageshack.us/img293/1434/teslahv5.png, que puis-je faire pour le réparer? –

+0

Je pense que la ligne bg.paste (im, im) doit être bg.paste (im, mask = im) – Ramast

+2

Got '*** ValueError: mauvais masque de transparence' pour mask = im – Sandeep

4

Les œuvres suivantes pour moi sur 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

J'ai essayé cette approche au début. Le simple fait de convertir directement en mode RVB fonctionne avec un masque aux contours nets, mais peut échouer assez méchamment avec un masque aux contours flous. – kindall

+0

Pouvez-vous fournir un lien vers une image où elle échoue? Je peux voir si je peux l'obtenir au travail – uncreative

+0

[Voici l'un] (http://mac.jerrykindall.com:81/pil/jk.png) J'ai fait jouer avec cela. Et [voici le résultat] (http://mac.jerrykindall.com:81/pil/jk_bad.png) de simplement enlever le canal alpha. – 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 clé est de rendre le masque (pour la pâte) l'image elle-même.

Cela devrait fonctionner sur les images qui ont « ligne ci-dessous » « bords souples » (où la transparence alpha est définie pour ne pas être 0 ou 255)