テレビや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重縁取りはできる?
デフォルトの機能ではできないものの、組み合わせることで可能です。
手順は簡単。
まずは、外側の縁用に、縁の幅の太い設定で文字を描写します。ここでは、「stroke_width」を「6」に、「stroke_fill」を「white」にしました。
そこに、上のコードで書いた文字を重ねます。
結果はこの通り。
より見やすくなりました。
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ライブラリ「Pillow」の投稿まとめ