Table of Content
はじめに
- アイキャッチ画像が面倒なときは,文字だけを設定したい。
- コマンドラインで作ってしまいたい。
- 文字だけのアイキャッチ画像生成
- Pythonで画像を作る。
アイデア
- Webサービス化する。
- フォントはM+から選択する。
行間
行間は文字の高さ×行間倍率で計算する。
行間倍率=1のとき,行間は文字の高さと一致する。
複数行の表示に対応する
文字の高さはだいたい同じとして,複数行の文字を綺麗に中心部分に並べるために,最初の行を書き込む高さを以下の式で計算する。
$$
\rm開始Height = \frac{\rm画像Height - ((\rm行数 \times 文字Height) + ((\rm行数-1) \times 行間倍率))}{2}
$$
import PIL.Image
import PIL.ImageDraw
import PIL.ImageFont
# 使うフォント,サイズ,描くテキストの設定
ttfontname = "C:\\Users\\soyukke\\Downloads\\mplus-TESTFLIGHT-063a\\mplus-1p-black.ttf"
fontsize = 60
text = "Flutter開発の初歩 \n セットアップ & デバッグ"
texts = text.splitlines()
# アイキャッチ画像サイズ
canvasSize = (1200, 630)
backgroundRGB = (255, 255, 255)
textRGB = (0, 0, 0)
# 文字を描く画像の作成
img = PIL.Image.new('RGB', canvasSize, backgroundRGB)
draw = PIL.ImageDraw.Draw(img)
font = PIL.ImageFont.truetype(ttfontname, fontsize)
# 文字高さオフセット
# 最初の行は高さ - (行数*文字高さ + (行数-1)*文字高さ*0.75) / 2
# TODO 文字の高さが毎回微妙に変わるのでループ外で固定値を取得する。
textoffset = 0
for text in texts:
textWidth, textHeight = draw.textsize(text, font=font)
initialTop = (canvasSize[1] -
(len(texts)*textHeight + (len(texts) - 1)*0.75)) / 2
print(f"initialWeight {initialTop}")
print(f"1200 {textWidth}")
# (横幅 - 文字幅) / 2からスタートする。
# 改行は 文字高さ / 2だけ開ける。
textTopLeft = ((1200 - textWidth)//2,
initialTop + textoffset)
draw.text(textTopLeft, text, fill=textRGB, font=font)
# 行間 0.75 (1=文字高さ)
textoffset += textHeight * 1.75
# 画像保存
img.save("image2.png")
コメント