前書き
こんにちはatomです。
仕事の一環でちょっと Pillowを使って画像をいじる場面がありました。
ちょこちょこと調べながらやったので、同じようなことでつまづくかたが減るようにメモを残します。
Pillowって何?
リサイズや切り出し、この記事のテーマの文字を入れる、などの画像処理をすることができるライブラリです。
簡単な処理をしたいだけなら結構便利。
筆者のやりたかったこと
- たくさんある画像に文字を入れたい
- 文字は複数行に渡っていて右下端が切れると嫌なので座標を適宜指定したい
- ついでに文字の画像全体に占める割合を気にしておきたい
いざ
先にPillowで画像に文字を入れるときの大まかな使い方を書きます。
from PIL import Image, ImageDraw, ImageFont
img = Image.open('ファイル名')
draw = ImageDraw.Draw(img)
text = '書き込みたい文字'
font = ImageFont.truetype('フォントファイルの指定', 文字サイズ)
# textメソッドを使って、指定したtextが第一引数の座標に書き込まれる。
draw.text((x座標, y座標), text, font=font)
img.open(’新しいファイル名’)
x,y座標と文字サイズはintです。
つまづいたところ
1.使えるフォントの一覧がわからない
ft-listコマンド(macじゃない方は適宜調べてみてください...)で一覧を取得可能。
今回はヒラギノ角ゴシックを使いたかったので
fc-list | grep ヒラギノ角ゴシック
という感じで絞って適当に見繕った。
2.文字の右端の座標を知りたい
multiline_textbboxメソッドを使って取得します。
このメソッドの返り値が文字の占める領域(バウンディングボックス)のleft, top, right, bottomとなるので、とりあえず下の例のように画像左上に文字を書いたとして、ボックスの大きさを確認します。
bbox = draw.multiline_textbbox((0, 0), text, font=font)
座標がわかるので、上に書いてあったバウンディングボックスの画像全体に対する割合も計算が簡単です。
計算は特にPillowに関わりないので割愛。