2009-05-20 26 views

答えて

62

最も簡単な方法は、マスクを使用することです。あなたが望む任意の形状の白黒マスクを作成します。ここで私はあなたがサムネイルのサイズは変数になりたい場合は、ImageDrawを使用して描画することができ

alt text


を使用したマスクがある

from PIL import Image, ImageOps 

mask = Image.open('mask.png').convert('L') 
im = Image.open('image.png') 
output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5)) 
output.putalpha(mask) 
output.save('output.png') 

アルファ層として、その形状を置きますマスク。

from PIL import Image, ImageOps, ImageDraw 

size = (128, 128) 
mask = Image.new('L', size, 0) 
draw = ImageDraw.Draw(mask) 
draw.ellipse((0, 0) + size, fill=255) 
im = Image.open('image.jpg') 
output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5)) 
output.putalpha(mask) 
output.save('output.png') 

あなたはGIFで出力したい場合は、あなたの代わりにputalphaのペースト機能を使用する必要があります。私は、次の変更をした

from PIL import Image, ImageOps, ImageDraw 

size = (128, 128) 
mask = Image.new('L', size, 255) 
draw = ImageDraw.Draw(mask) 
draw.ellipse((0, 0) + size, fill=0) 
im = Image.open('image.jpg') 
output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5)) 
output.paste(0, mask=mask) 
output.convert('P', palette=Image.ADAPTIVE) 
output.save('output.gif', transparency=0) 

注:

  • マスクが反転しました。白い は黒色に置き換えられ、その逆もありました。
  • 私は '適応性のある'パレットで 'P'に変換しています。それ以外の場合、PILはWeb上で安全な色しか使用せず、結果は悪く見えます。
  • 私は画像

にして透明度情報を追加しているに注意してください:このアプローチの大きな問題があります。 GIF画像に黒い部分が含まれていると、それらの部分もすべて透明になります。これを回避するには、透明度の別の色を選択します。 このためにPNG形式を使用することを強くお勧めします。しかし、あなたができなければ、それはあなたができる最高のものです。

+0

素晴らしい!そして、pngの代わりにgifを出力するのはどうですか?私はgifがアルファを扱っていないと思いますか? – ohnoes

+0

Gifはアルファチャンネルの透過性をサポートしていません。 1つの色を透明に設定することのみサポートしています。しかし、結果をgifで出力するために必要な調整を行いました。 –

+0

素晴らしい答え。私はこの技術を保存された画像に簡単に適用できますが、私はPython内でマスクを適用する問題に遭遇しました。あなたはこの質問を見ることができます。http://stackoverflow.com/questions/20150552/modify-the-alpha-channel-of-an-image-as-part-of-an-image-processing-workflow – zach

19

私はすでに受け入れ答えに結果として円をアンチエイリアスするためのソリューションを追加したい、トリックは大きなマスクを生産し、その後ANTIALIASフィルタを使用して、それをスケールダウンすることです。ここ コード

from PIL import Image, ImageOps, ImageDraw 

im = Image.open('image.jpg') 
bigsize = (im.size[0] * 3, im.size[1] * 3) 
mask = Image.new('L', bigsize, 0) 
draw = ImageDraw.Draw(mask) 
draw.ellipse((0, 0) + bigsize, fill=255) 
mask = mask.resize(im.size, Image.ANTIALIAS) 
im.putalpha(mask) 
です

これは私の意見ではるかに良い結果をもたらします。

+1

おい、ANTIALIASは大きな違いを作った!ありがとう! = D – ademarizu

+0

これは私にとってとてもうまくいった。マスクを設計する必要はありません。 –

関連する問題