Python

画像にも透け感を!Pythonで半透明の図形を描くには?

画像にも透け感を!Pythonで半透明の図形を描くには?

前回、画像に文字入れをするにあたり、四角い下地を作って文字を見やすくしました。

しかし、せっかくの画像が見えないのも、なんかもったいないなぁ。
文字を目立たせつつ、画像も見える、半透明の図形を描き方をまとめました。

 

準備するものは?

ライブラリ「Pillow」を使います。
インストール方法などは、前の投稿をご覧ください。


 

コードはどのように書くの?

透過を表現するのは「アルファチャンネル」と呼ばれるデータ領域で、色とは別に管理されます。それを扱えるように「RGBA」に変換するか、「putalpha()」で追加します。
アルファチャンネルが扱える画像ファイルに、「RGBA」で描写した図形を「Image.alpha_composite()」で合成します。
合成したものは、そのままpngファイルで出力できますし、jpgファイルにしたければ一度「RGB」に変換すれば保存できます。

from PIL import Image, ImageFont, ImageDraw
 
# 画像ファイルを読み込み、「RGBA」に変換する
photo_img = Image.open('test.jpg').convert('RGBA')
img_size = photo_img.size
 
# 透過ボックス作成
a = Image.new('RGBA',img_size)
draw_img = ImageDraw.Draw(a)
draw_img.rectangle(
    [(0, img_size[1] / 3), (img_size[0], img_size[1] * 2 / 3)],
    fill = (255, 220, 0, 128)
)
 
# フォントは源ノ角ゴシック
fnt = ImageFont.truetype(r'C:/Windows/Fonts/SourceHanSans-Heavy.otf', 20)
 
# 文字入れ
draw_img.text(
    (img_size[0] / 2, img_size[1] / 2),
    'Pythonで半透明の図形の上に文字入れをする',
    fill = 'black',
    font = fnt,
    anchor = 'mm',
)
 
# 合成
out_img = Image.alpha_composite(photo_img,a)
 
# jpgファイルで保存するなら「RGB」に変換
out_img = out_img.convert('RGB')
 
# 保存
out_img.save('test2.jpg')

 

コードの解説

Image.convert()

画像のモードを変換します。
アルファチャンネルを扱いたいなら「Image.convert('RGBA')」とします。
jpgファイルに保存するなら、逆に「Image.convert('RGB')」とアルファチャンネルのないモードに変換します。
モードの種類は公式ドキュメントをご覧ください。
 

Image.alpha_composite()

指定された2つの画像をアルファブレンド(いわゆる合成のこと)します。
画像は2つとも、モードが「RGBA」、かつ同じサイズでなくてはいけません。
ゆえに、このコードでは「Image.size」で読み込んだ画像ファイルのサイズを取得し、それを元に合成するキャンパスを作成しています。

 

コードの実行結果

画像にも透け感を!Pythonで半透明の図形を描くには?
jpgファイルでも半透明の下地を入れることができました。

 

おまけ:試して失敗したこと

「Image.open().putalpha(255)」と、画像ファイルを開きながらアルファチャンネルを追加しようとしたら、エラーになった。「a = Image.open()」「a.putalpha(255)」と、2行に分けると上手くいく。

「RGBA」に変換した画像ファイルに直接図形を描こうとしても透過しない。新しいキャンバスを作って合成という手順は省けないらしい。
 

まとめ

半透明の図形を描くには、アルファチャンネルのモードで描写します。
画像に描きたい場合は、アルファブレンド(合成のこと)をすれば良いです。
透過が扱えるのはPNGファイルだけだと思っていましたが、「RGB」モードに変換すればJPGファイルでも保存できることを知れて良かったです。

-Python
-, , , , , , , , , , , , ,

© 2022 オン香講師の将棋教室以外の話