48

PIL を使用して円形の画像サムネイルを生成するにはどうすればよいですか? 円の外側のスペースは透明にする必要があります。

スニペットは非常に高く評価されます。事前に感謝します。

4

4 に答える 4

88

最も簡単な方法は、マスクを使用することです。任意の形状の白黒マスクを作成します。そしてputalpha、その形状をアルファレイヤーとして配置するために使用します:

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')

私が使用したマスクは次のとおりです。

代替テキスト


サムネイルのサイズを可変にしたい場合はImageDraw、マスクを使用して描画できます。

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 形式を使用することを強くお勧めします。しかし、それができない場合は、それが最善の方法です。

于 2009-05-20T20:37:16.203 に答える