Python

工夫次第で2重縁取りも!Pythonで画像に縁取りした文字を入れるには?

工夫次第で2重縁取りも!Pythonで画像に縁取りした文字を入れるには?

テレビやYouTubeでのテロップは、ほぼ縁がついていませんか?
あれをPythonで実現したくていろいろやってみたので、その方法をまとめます。
今回もライブラリ「Pillow」を使います。

 

縁取りした文字の入れ方は?

「ImageDraw.text()」の引数「stroke_width」と「stroke_fill」を指定します。
「stroke_width」は縁の線幅、「stroke_fill」は縁の線色です。
前回のコードを修正し、今回は、文字色を白、縁の色を青にしました。

from PIL import Image, ImageFont, ImageDraw
txt = 'Pythonで文字サイズを自動調整する'
 
# 画像ファイルを読み込み、「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)
)
 
# フォントは源ノ角ゴシック
font = r'C:/Windows/Fonts/SourceHanSans-Heavy.otf'
i = 1
 
# 画像幅の80%を超えるまでループ
while draw_img.textsize(txt,ImageFont.truetype(font, i))[0] < img_size[0] * 0.8 : i += 1
 
# 文字入れ
draw_img.text(
    (img_size[0] / 2, img_size[1] / 2),
    txt,
    fill = 'white',
    font = ImageFont.truetype(font , i - 1),
    anchor = 'mm',
    stroke_width = 3,
    stroke_fill = 'blue'
)
 
# 合成
out_img = Image.alpha_composite(photo_img,a)
 
# jpgファイルで保存するなら「RGB」に変換
out_img = out_img.convert('RGB')
 
# 保存
out_img.save('test2.jpg')

 

コードの実行結果は?

工夫次第で2重縁取りも!Pythonで画像に縁取りした文字を入れるには?

キレイに縁取りできていますね。

 

2重縁取りはできる?

デフォルトの機能ではできないものの、組み合わせることで可能です。
手順は簡単。
まずは、外側の縁用に、縁の幅の太い設定で文字を描写します。ここでは、「stroke_width」を「6」に、「stroke_fill」を「white」にしました。
工夫次第で2重縁取りも!Pythonで画像に縁取りした文字を入れるには?

そこに、上のコードで書いた文字を重ねます。
結果はこの通り。
工夫次第で2重縁取りも!Pythonで画像に縁取りした文字を入れるには?
より見やすくなりました。

2重縁取り文字を入れるコードはこちら

from PIL import Image, ImageFont, ImageDraw
txt = 'Pythonで文字サイズを自動調整する'
 
# 画像ファイルを読み込み、「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)
)
 
# フォントは源ノ角ゴシック
font = r'C:/Windows/Fonts/SourceHanSans-Heavy.otf'
i = 1
 
# 画像幅の80%を超えるまでループ
while draw_img.textsize(txt,ImageFont.truetype(font, i))[0] < img_size[0] * 0.8 : i += 1
 
# 文字入れ・外側の縁用
draw_img.text(
    (img_size[0] / 2, img_size[1] / 2),
    txt,
    fill = 'white',
    font = ImageFont.truetype(font , i - 1),
    anchor = 'mm',
    stroke_width = 6,
    stroke_fill = 'white'
)
# 文字入れ・内側の縁用
draw_img.text(
    (img_size[0] / 2, img_size[1] / 2),
    txt,
    fill = 'white',
    font = ImageFont.truetype(font , i - 1),
    anchor = 'mm',
    stroke_width = 3,
    stroke_fill = 'blue'
)
 
# 合成
out_img = Image.alpha_composite(photo_img,a)
 
# jpgファイルで保存するなら「RGB」に変換
out_img = out_img.convert('RGB')
 
# 保存
out_img.save('test2.jpg')

 

まとめ

Pythonのライブラリ「Pillow」で縁取りした文字を入れるには、「stroke_width」、「stroke_fill」を設定します。
縁の幅を変えて、重ねることで、2重縁取りも可能です。
やはり2重縁取り文字は見やすいですね。テレビのテロップに多用されている理由がよくわかりました。

-Python
-, , , , , , ,

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