Pythonでサクッと作るアイキャッチ

プログラミング
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")

参考

コメント