2022年1月28日金曜日

【Pillow】ImageDraw.textによる文字の描画

 画像処理ライブラリPillowのImageDraw.textで文字を描画できる。フォントや文字サイズの指定はImageFont.truetypeにより行う。

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

from PIL import Image, ImageDraw, ImageFont





1. ImageDraw.text, ImageFont.truetypeの書式

 ImageDraw.textの書式は以下。必須の引数はxy, textのみだが、日本語を描画する際にはfontで日本語フォントを指定しないとエラーになる。

ImageDraw.text(xy, text, fill=None, font=None, anchor=None, spacing=4, 
    align='left', direction=None, features=None, language=None,  
    stroke_width=0, stroke_fill=None, embedded_color=False)
引数 意味
xy 描画位置。文字列左上の座標を(x, y)で指定。
text 描画する文字列。改行文字が含まれる場合 multiline_text() に処理が送られる。
fill 文字の色
font フォント。ImageFontで指定する
anchor 文字列の基準位置。デフォルトは左上('la')。
spacing multiline_text() に処理が送られた場合の行間のピクセル数。デフォルトは4
align multiline_text() に処理が送られた場合の行揃え。デフォルトは左揃え('left')
direction 文字の進行方向。'rtl'(right to left), 'ltr'(left to right), 'ttb'(top to bottom)が指定できる
features OpenTypeフォント特性の指定
language 言語の指定。BCP 47 language codeによる。言語による字体の違いを補う
stroke_width 文字の縁取り幅(ピクセル)。デフォルトは0
stroke_fill 文字の縁取り色
embedded_color カラー絵文字を使う際の情報


 TrueTypeフォントまたはOpenTypeフォントを使うにはImageFont.truetypeにより読み出す。書式は以下。必須の引数はxy, textのみだが、日本語を描画する際にはfontで日本語フォントを指定しないとエラーになる。

ImageFont.truetype(font=None, size=10, index=0, 
    encoding='', layout_engine=None)
引数 意味
font フォントファイルのパスとファイル名
size 文字サイズをポイントで指定
index font faceの指定
encoding フォントencodingの指定。デフォルトはUnicode
layout_engine layout engineの指定


 文字を描画する際の手順は、最初に Image オブジェクトを作成、さらに Draw オブジェクトを作成する。 ImageFont.truetype でフォント種、文字サイズを指定した上で Draw オブジェクトに対してImageDraw.text メソッドを用いることで文字が描画がされる。

from PIL import Image, ImageDraw, ImageFont

im = Image.new('RGB', (400, 200), (130, 130, 130))

draw = ImageDraw.Draw(im)
font = ImageFont.truetype('C:\Windows\Fonts\meiryo.ttc', 60)
draw.text((40, 70), '文字の描画', fill=(255, 175, 0), font=font)

im.save('text.png')

実行結果





2. anchorの指定

 anchorを指定することで文字列の描画基準位置を設定できる。
横書きの場合、x軸方向の位置を示す一文字(l, m, r)とy軸方向の位置を示す一文字(a, t, m, s, b, d)を組み合わせた2文字で表現する。

横書きのanchor定義(リファレンスより)


'la'(left-ascender), 'lt'(left-top), 'mm'(middle-middle), 'rs'(right-baseline)を指定した場合。
わかりやすくするためxyの座標(200, 100)に白い円を描いてある。

from PIL import Image, ImageDraw, ImageFont

anchor = ['la', 'lt', 'mm', 'rs']

for i in anchor:
    im = Image.new('RGB', (400, 200), (130, 130, 130))
    draw = ImageDraw.Draw(im)
    
    # anchor位置に白い円を表示
    draw.ellipse((195, 95, 205, 105), fill=(255, 255, 255),
             outline=(255, 255, 255))
  
    font = ImageFont.truetype('C:\Windows\Fonts\meiryo.ttc', 60)
    draw.text((200, 100), '文字の描画', fill=(255, 175, 0), 
              font=font, anchor=i)

    im.save('text_'+i+'.png')

実行結果

'la'(left-ascender)


'lt'(left-top)


'mm'(middle-middle)


'rs'(right-baseline)



3. 縁取り文字の描画

ImageDraw.textの引数stroke_width, stroke_fillを指定することで縁取り文字が描画できる。
幅5ピクセルの黒い縁取りを追加する場合。

from PIL import Image, ImageDraw, ImageFont

im = Image.new('RGB', (400, 200), (130, 130, 130))
draw = ImageDraw.Draw(im)

font = ImageFont.truetype('C:\Windows\Fonts\meiryo.ttc', 60)
# 縁取りなし
draw.text((40, 20), '文字の描画', fill=(255, 175, 0), font=font)
# 縁取りあり
draw.text((40, 90), '文字の描画', fill=(255, 175, 0), font=font, 
          stroke_width=5, stroke_fill=(0, 0, 0))

im.save('text_stroke.png')

実行結果





4. リファレンス

Pillow (PIL Fork) > ImageDraw Module > ImageDraw.text
Pillow (PIL Fork) > ImageFont Module > PIL.ImageFont.truetype
Pillow (PIL Fork) > Handbook > Text anchors

使用バージョン:Python 3.8.8 / Pillow 8.2.0

0 件のコメント:

コメントを投稿