LoginSignup
3
0

More than 1 year has passed since last update.

PythonのImageFontで使うフォントファイルをコード内に記述する

Last updated at Posted at 2021-09-12

Qiitaの初投稿記事です
調べても出てこず、結構苦戦したので記事にしてみました

追記

試してないですが、リソースを使えば同じようなことが簡単にできそうです - 2022/03/06

概要

pyinstallerというpythonをexeに変換するソフトを使用する際にフォントのパス設定で困ったので、インラインで書けないかと試行錯誤した話

元となるコード

font.ttfというフォントを読み込んでfont_testと書いた画像を作るプログラム

image.py
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO

im = Image.new('RGB', (900, 600), "#ffffff")
draw = ImageDraw.Draw(im)
font = ImageFont.truetype("./font.ttf",200)
draw.text((50,50), "font_test", fill="#000000", font=font)
im.save("./test.png")

使用するライブラリ

PillowとBytesIOを使用します
インストールされていない場合はインストールしてください

方針

準備

バイナリのフォントファイルをよみこむ

メインのコード

読み込んだデータをPythonに記述する
BytesIOを使ってメモリ上にフォントファイルを保存する
ImageFontでメモリ上のフォント

完成したコード

準備

read_font.py
from io import BytesIO

path = "./font.ttf" # ここに読み込むフォントファイルのパス

with open(path,"rb") as f:
    s = f.read() # フォントの読み込み

with BytesIO() as bs:
    bs.write(s)
    content = bs.getvalue()

with open("./font.txt","a") as s:
    s.write(str(content)) # font.txtに出力

メインのコード

image.py
from PIL import Image, ImageTk, ImageOps, ImageDraw, ImageFont
from io import BytesIO

font = b'\x00\x01\x00\x00\x00\...' # ここにfont.txtの中身を貼り付け

im = Image.new('RGB', (900, 600), "#ffffff")
draw = ImageDraw.Draw(im)
font = ImageFont.truetype(BytesIO(font),200) # フォントの読み込み
draw.text((50,50), "font_test", fill="#000000", font=font) # 画像に文字を追加
im.save("./test.png") # 画像をtest.pngに出力

使い方

  1. 上のコードをコピペ
  2. read_font.pyの中のpath = "./font.ttf"の部分を読み込むフォントファイルのパスに書き換える
  3. read_font.pyを実行する
  4. font.txtができるのでimage.pyのfont = b'\x00\x01\x00\x00\x00\...'をfont.txtの中身に書き換える
  5. image.pyを実行する

まとめ

したかったことはできました
内容に不足や誤りがあれば補足します

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0