前回、画像に文字入れをするにあたり、四角い下地を作って文字を見やすくしました。 前回、Pythonで画像に文字を入れるコードを書きました。 ただ、画像によっては文字が見にくいこともあるので、下地を入れたい。 Pythonでは図形の描写もできるので、その方法をまとめました。 &nb ... 続きを見る
前回の内容:見えにくい文字の下地に!Pythonで画像に図形を描くには?
しかし、せっかくの画像が見えないのも、なんかもったいないなぁ。
文字を目立たせつつ、画像も見える、半透明の図形を描き方をまとめました。
準備するものは?
ライブラリ「Pillow」を使います。 YouTubeで公開している詰将棋動画のサムネイル。 パターンを決めているので、自動でもっと簡単にできないかなぁと調べていたら、「Pythonで画像加工ができる」と、知りました。 実際にやってみたら、 ... 続きを見る
インストール方法などは、前の投稿をご覧ください。
Pythonで画像加工ができる!?写真に文字入れするには?
コードはどのように書くの?
透過を表現するのは「アルファチャンネル」と呼ばれるデータ領域で、色とは別に管理されます。それを扱えるように「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」で読み込んだ画像ファイルのサイズを取得し、それを元に合成するキャンパスを作成しています。
コードの実行結果
おまけ:試して失敗したこと
「Image.open().putalpha(255)」と、画像ファイルを開きながらアルファチャンネルを追加しようとしたら、エラーになった。「a = Image.open()」「a.putalpha(255)」と、2行に分けると上手くいく。
「RGBA」に変換した画像ファイルに直接図形を描こうとしても透過しない。新しいキャンバスを作って合成という手順は省けないらしい。
まとめ
半透明の図形を描くには、アルファチャンネルのモードで描写します。
画像に描きたい場合は、アルファブレンド(合成のこと)をすれば良いです。
透過が扱えるのはPNGファイルだけだと思っていましたが、「RGB」モードに変換すればJPGファイルでも保存できることを知れて良かったです。
Pythonライブラリ「Pillow」の投稿まとめ