2011-10-27 82 views
15

Tôi đang tạo mẫu bộ xử lý hình ảnh trong Python 2.7 bằng PIL1.1.7 và tôi muốn tất cả hình ảnh kết thúc bằng JPG. Các loại tệp đầu vào sẽ bao gồm tiff, gif, png cả với độ trong suốt và không có. Tôi đã cố gắng để kết hợp hai kịch bản mà tôi thấy rằng 1. chuyển đổi các loại tập tin khác để JPG và 2. loại bỏ minh bạch bằng cách tạo ra một hình ảnh trắng trống và dán hình ảnh ban đầu trên nền trắng. Các tìm kiếm của tôi đang bị spam với những người tìm cách tạo ra hoặc duy trì sự minh bạch hơn là ngược lại.PIL Chuyển đổi PNG hoặc GIF với Độ trong suốt sang JPG mà không cần

Tôi hiện đang làm việc với điều này:

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

Cả hai kịch bản làm việc trong sự cô lập, nhưng như tôi đã kết hợp chúng tôi nhận được một ValueError: Xấu Transparency Mask.

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 

Tôi nghi ngờ rằng nếu tôi lưu PNG không có độ trong suốt thì tôi có thể mở tệp mới đó và lưu lại dưới dạng JPG và xóa PNG được ghi vào đĩa. hy vọng rằng có một giải pháp tao nhã mà tôi chưa tìm thấy.

+0

Tại sao bạn mong chờ vấn đề là "dòng bên dưới" khi mã được barfing trên '.paste()' và thậm chí không đến được dòng đó? – kindall

Trả lời

28

Hãy RGB nền của bạn, không RGBA. Và loại bỏ chuyển đổi sau này của nền sang RGB, tất nhiên, vì nó đã ở trong chế độ đó. Điều này làm việc cho tôi với một hình ảnh thử nghiệm tôi đã tạo:

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

Không thành công trên http://img293.imageshack.us/img293/1434/teslahv5.png, tôi có thể làm gì để khắc phục sự cố? –

+0

Tôi nghĩ rằng dòng bg.paste (im, im) cần phải là bg.paste (im, mask = im) – Ramast

+2

Got '*** ValueError: mặt nạ trong suốt mờ' cho mask = im – Sandeep

4

Các công trình sau đây đối với tôi trên 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

Tôi đã thử phương pháp này lúc đầu. Chỉ cần chuyển đổi trực tiếp sang chế độ RGB làm việc với một mặt nạ cứng lưỡi, nhưng có thể thất bại khá nastily với một mặt nạ mềm lưỡi. – kindall

+0

Bạn có thể cung cấp liên kết đến hình ảnh không thành công không? Tôi có thể xem nếu tôi có thể làm cho nó hoạt động – uncreative

+0

[Đây là một] (http://mac.jerrykindall.com:81/pil/jk.png) Tôi đã thực hiện để chơi với điều này. Và [đây là kết quả] (http://mac.jerrykindall.com:81/pil/jk_bad.png) của việc loại bỏ kênh 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) 

Điều quan trọng là để làm cho mặt nạ (đối với dán) các hình ảnh riêng của mình.

này nên làm việc trên những hình ảnh mà có "cạnh mềm" (nơi minh bạch alpha được thiết lập để không thể là 0 hoặc 255)

Các vấn đề liên quan