2022年2月6日日曜日

【Pillow】アルファチャンネル付き図形と画像の合成

 画像処理ライブラリPillowで画像上に半透明の図形を描画する場合、画像の上にアルファチャンネル付き図形を直接描画しても半透明にはならず、アルファチャンネル付き画像とアルファチャンネル付き図形が描画された図形をPIL.Image.alpha_composite(im1, im2)で合成する必要がある。

Pillow(PIL)を使うためにはインポートが必要。PIL.Image、PIL.ImageDraw、PIL.ImageFontモジュールは通常以下の形式でインポートされる。

from PIL import Image, ImageDraw, ImageFont

また図形を合成する画像 'leaves.jpg'(幅600ピクセルx高さ400ピクセル) は以下(フリー写真素材ぱくたそより)





1. アルファチャンネル付き図形と画像の合成

 画像の上に半透明の図形を描画したい場合に、画像を読み出してputalphaでアルファチャンネルを追加し、その上にImageDrawで直接アルファチャンネル付き図形を描画しても狙った結果にはならない。

from PIL import Image, ImageDraw, ImageFont

im = Image.open('leaves.jpg')
im.putalpha(255)

draw = ImageDraw.Draw(im)
font = ImageFont.truetype('C:\Windows\Fonts\meiryob.ttc', 110)
draw.text((20, 0), '紅葉した葉', fill=(0, 105, 255, 255), font=font)
draw.text((20, 130), '紅葉した葉', fill=(0, 105, 255, 128), font=font)
draw.text((20, 260), '紅葉した葉', fill=(0, 105, 255, 64), font=font)

im.save('direct.png')




 putalphaでアルファチャンネルを追加した画像と、アルファチャンネル付き図形を描画した画像をImage.alpha_compositeでアルファブレンドすることで半透明の図形を描画することができる。
アルファブレンドする2つの画像はサイズが同じ必要がある。また図形を描画する画像のアルファ値を0として下地を完全に透明にする。また、Image.alpha_compositeは引数の1番目の画像の上に2番目の画像を合成するため、引数の順番は下地が先で図形を後にする。

from PIL import Image, ImageDraw, ImageFont

im1 = Image.open('leaves.jpg')
im1.putalpha(255)

im2 = Image.new('RGBA', (600, 400), (0, 0, 0, 0))
draw = ImageDraw.Draw(im2)
font = ImageFont.truetype('C:\Windows\Fonts\meiryob.ttc', 110)
draw.text((20, 0), '紅葉した葉', fill=(0, 105, 255, 255), font=font)
draw.text((20, 130), '紅葉した葉', fill=(0, 105, 255, 128), font=font)
draw.text((20, 260), '紅葉した葉', fill=(0, 105, 255, 64), font=font)

comp = Image.alpha_composite(im1, im2)

comp.save('comp.png')




2. リファレンス

Pillow (PIL Fork) > ImageDraw Module > PIL.Image.alpha_composite(im1, im2)
Pillow (PIL Fork) > ImageDraw Module > Image.putalpha(alpha)

使用バージョン:Python 3.8.12 / Pillow 9.0.0

0 件のコメント:

コメントを投稿