テレビやYouTubeでのテロップは、ほぼ縁がついていませんか?
あれをPythonで実現したくていろいろやってみたので、その方法をまとめます。
今回もライブラリ「Pillow」を使います。
縁取りした文字の入れ方は?
「ImageDraw.text()」の引数「stroke_width」と「stroke_fill」を指定します。
「stroke_width」は縁の線幅、「stroke_fill」は縁の線色です。
前回のコードを修正し、今回は、文字色を白、縁の色を青にしました。
from PIL import Image, ImageFont, ImageDrawtxt = '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, ImageDrawtxt = '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」の投稿まとめ

