2011-10-27 12 views
15

PIL1.1.7を使用してPython 2.7で画像プロセッサのプロトタイプを作成しています。すべての画像がJPGになるようにしたいと思います。入力ファイルの種類には、透過性と無しの両方のtiff、gif、pngが含まれます。私は、私が見つけた2つのスクリプトを組み合わせようとしてきました.1。他のファイルタイプをJPGに変換し、2。空白の白いイメージを作成し、元のイメージを白い背景に貼り付けることで透明性を取り除きます。私の検索は、反対ではなく透明性を生み出すか維持しようとする人々とスパムされています。PIL透明度のあるPNGまたはGIFをJPGに変換せずに

私は現在、これで働いている:

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

はどちらのスクリプトは単独で動作しますが、私はそれらを組み合わせているように私はValueErrorを取得:悪い透明マスクを。

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 

私は透明度なしでPNGを保存していた場合、私は、その新しいファイルを開くことができることを疑い、およびJPGとしてそれを再保存し、ディスクに書き込まれたPNGを削除し、私はよ私がまだ見つけていない優雅な解決策があることを願っています。

+0

は、なぜあなたは問題がコードがbarfingされたときに、「次の行」で期待を持っているそれらの画像上で動作するはずです'.paste()'に書かれていて、その行にさえいらっしゃいませんか? – kindall

答えて

28

に私のために、次の作品は、あなたの背景RGB、RGBAないことを確認します。また、後でその背景にあるRGBの変換を取り除きます。もちろん、すでにそのモードになっています。

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

http://img293.imageshack.us/img293/1434/teslahv5.pngに失敗しました。どうすれば修正できますか? –

+0

私は「***とValueError:悪い透明マスク」線bg.paste(イム、イム)bg.paste(イム、マスク= IM) – Ramast

+2

ガットであることが必要だと思いマスク用=イム – Sandeep

4

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

私はこのアプローチを最初に試みました。 RGBモードに直接変換するだけでは、ハードエッジのマスクを使用しても機能しますが、ソフトエッジのマスクを使用すると非常に邪魔になることがあります。 – kindall

+0

イメージに失敗したリンクを提供できますか?私はそれが働くことを得ることができるかどうかを見ることができます – uncreative

+0

[これは1つです](http://mac.jerrykindall.com:81/pil/jk.png)これで遊ぶことができました。そして、アルファチャンネルを取り除くだけの[こちらの結果](http://mac.jerrykindall.com:81/pil/jk_bad.png)。 – 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) 

キー(ペースト用)画像自体をマスクをすることです。これは、私が作成したテスト画像で私のために働きました。

これは(アルファ透明度が0にならないように設定されているか、255)「ソフトエッジ」

関連する問題