2011-10-27 27 views
15

Jestem prototypowania procesora obrazu w Pythonie 2.7 przy użyciu PIL1.1.7 i chciałbym, aby wszystkie obrazy zakończyły się w JPG. Typy plików wejściowych będą zawierać tiff, gif, png zarówno z przezroczystością, jak i bez. Próbowałem połączyć dwa skrypty, które znalazłem: 1. przekonwertować inne typy plików na JPG i 2. usunąć przezroczystość, tworząc pusty biały obraz i wklejając oryginalny obraz na białym tle. Moje wyszukiwania są spamowane przez osoby, które chcą wygenerować lub zachować przejrzystość, a nie odwrotnie.PIL Konwersja PNG lub GIF z przezroczystością do JPG bez

Obecnie pracuję z tym:

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

Oba skrypty działają w izolacji, ale jak już je łączyć dostaję ValueError: Bad maską przezroczystości.

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 

Podejrzewam, że gdybym zapisać PNG bez przejrzystości mogłem wtedy otworzyć ten nowy plik i ponownie zapisać go jako JPG, PNG i usunąć który został napisany na dysku, ale jestem mając nadzieję, że istnieje eleganckie rozwiązanie, którego jeszcze nie znalazłem.

+0

Dlaczego można oczekiwać problemem jest „linia poniżej”, gdy kod jest barfing na '.paste()' i nawet nie dostanie się do tej linii? – kindall

Odpowiedz

28

Dokonaj tła RGB, a nie RGBA. I usuń późniejszą konwersję tła do RGB, oczywiście, ponieważ jest już w tym trybie. To działało na mnie z testu obrazu utworzonego:

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

Błąd kończy się na http://img293.imageshack.us/img293/1434/teslahv5.png, co mogę zrobić, aby to naprawić? –

+0

Myślę, że linia bg.paste (im, im) musi być bg.paste (im, maska ​​= im) – Ramast

+2

Otrzymałem "*** ValueError: niepoprawna maska ​​przezroczystości" dla maski = im – Sandeep

4

następujące prace dla mnie na 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

Próbowałem tego podejścia na początku. Po prostu konwersja bezpośrednio do trybu RGB działa z maską o ostrych krawędziach, ale może się nie powieść dość paskudnie z maską o miękkich krawędziach. – kindall

+0

Czy możesz podać link do obrazu, który zawodzi? Widzę, czy mogę go uruchomić – uncreative

+0

[Tutaj jest] (http://mac.jerrykindall.com:81/pil/jk.png) Zrobiłem to, aby grać. I [tutaj jest wynik] (http://mac.jerrykindall.com:81/pil/jk_bad.png) po prostu rozebraniu kanału 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) 

Kluczem jest, aby maskę (do pasty) ten sam obraz.

To powinno działać na tych obrazów, które mają „miękkie krawędzie” (gdzie przezroczystość alfa jest ustawiona na nie być 0 lub 255)

Powiązane problemy