もし任意の文字列を画像化できれば、たとえばSlackの絵文字ジェネレータを自作するなど、面白い使い道があるかと思い、やってみました。
使うもの
- Python
- Pillow
- Pillow — Pillow (PIL Fork) 9.1.1 documentation
- 無い場合は
pip install pillow
で入ります
サンプルのコード
とりあえず画像を出力する、だけのコードは以下。
from PIL import Image, ImageDraw, ImageFont
# RGB, 画像サイズ, 背景色を設定
im = Image.new("RGB", (512, 512), (256, 256, 256))
draw = ImageDraw.Draw(im)
# PCローカルのフォントへのパスと、フォントサイズを指定
font = ImageFont.truetype('C:/Windows/Fonts/meiryob.ttc', 140)
# 複数行の文字を出すのに、行ごとリストに入れてforで回す
texts = ["無いぞ、", "知名度。", "SCSK"]
# 文字描画の初期位置(画像左上からx, yだけ離れた位置)
x = 20
y = 0
# 文字の描画
for text in texts:
# 描画位置、描画する文字、文字色、フォントを指定
draw.text((x, y), text, fill=(26, 39, 146), font=font)
y = y + 150
# ファイルに出力
im.save("./image.png")
実行すると以下の画像が得られます。
※元ネタはこれ>あるぞ、ITの可能性。SCSK | SCSK株式会社
ただ、もうちょっとマシにやる余地もあります。
Draw Multiline Textを使う
ImageDraw Module — Pillow (PIL Fork) 9.1.1 documentation
text
を使って愚直に文字を書き込んでいってもいいのですが、multiline_text
を使っても実現できます。
コードはこちら。
from PIL import Image, ImageDraw, ImageFont
# RGB, 画像サイズ, 背景色を設定
im = Image.new("RGB", (512, 512), (256, 256, 256))
draw = ImageDraw.Draw(im)
# PCローカルのフォントへのパスと、フォントサイズを指定
font = ImageFont.truetype('C:/Windows/Fonts/meiryob.ttc', 140)
# 描画位置、描画する文字、文字色、フォントを指定
draw.multiline_text((20, 0), "無いぞ、\n知名度。\nSCSK", fill=(26, 39, 146), font=font)
# ファイルに出力
im.save("./image2.png")
改行コードを入れるだけで良く、全体がすっきりしました。
一方、長い文章をいいところで自動で改行させたい等の場合は別の工夫が必要になりそうです。
参考
- python Pillow(PIL)で日本語描画 - Emotion Explorer
- Create images with Python PIL and Pillow and write text on them
- Pythonの画像処理ライブラリPillow(PIL)の使い方 | note.nkmk.me
おまけ
知名度ないだけだと怒られそうなのでフォローのために以下画像も作りました。