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に出力
使い方
- 上のコードをコピペ
- read_font.pyの中の
path = "./font.ttf"
の部分を読み込むフォントファイルのパスに書き換える - read_font.pyを実行する
- font.txtができるのでimage.pyの
font = b'\x00\x01\x00\x00\x00\...'
をfont.txtの中身に書き換える - image.pyを実行する
まとめ
したかったことはできました
内容に不足や誤りがあれば補足します