PILを使用して円形画像サムネイルを生成するにはどうすればよいですか? 円の外側のスペースは透明である必要があります。PILを使用して円形サムネイルを生成するにはどうすればよいですか?
スニペットを高く評価していただきますようお願い申し上げます。
PILを使用して円形画像サムネイルを生成するにはどうすればよいですか? 円の外側のスペースは透明である必要があります。PILを使用して円形サムネイルを生成するにはどうすればよいですか?
スニペットを高く評価していただきますようお願い申し上げます。
最も簡単な方法は、マスクを使用することです。あなたが望む任意の形状の白黒マスクを作成します。ここで私はあなたがサムネイルのサイズは変数になりたい場合は、ImageDrawを使用して描画することができ
を使用したマスクがある
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)
注:
にして透明度情報を追加しているに注意してください:このアプローチの大きな問題があります。 GIF画像に黒い部分が含まれていると、それらの部分もすべて透明になります。これを回避するには、透明度の別の色を選択します。 このためにPNG形式を使用することを強くお勧めします。しかし、あなたができなければ、それはあなたができる最高のものです。
私はすでに受け入れ答えに結果として円をアンチエイリアスするためのソリューションを追加したい、トリックは大きなマスクを生産し、その後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)
です
これは私の意見ではるかに良い結果をもたらします。
おい、ANTIALIASは大きな違いを作った!ありがとう! = D – ademarizu
これは私にとってとてもうまくいった。マスクを設計する必要はありません。 –
素晴らしい!そして、pngの代わりにgifを出力するのはどうですか?私はgifがアルファを扱っていないと思いますか? – ohnoes
Gifはアルファチャンネルの透過性をサポートしていません。 1つの色を透明に設定することのみサポートしています。しかし、結果をgifで出力するために必要な調整を行いました。 –
素晴らしい答え。私はこの技術を保存された画像に簡単に適用できますが、私はPython内でマスクを適用する問題に遭遇しました。あなたはこの質問を見ることができます。http://stackoverflow.com/questions/20150552/modify-the-alpha-channel-of-an-image-as-part-of-an-image-processing-workflow – zach