文字列をOGP画像にしてファイル出力するPythonスクリプトを書いた

Python,プログラム

出力サンプル

文字列をOGP画像にしてファイル出力するPythonスクリプトを書いた。

記事タイトルからOGP画像を自動生成する機能をつくった | ktaskn.jp」を参考にさせて頂いて、ファイルに出力するようにしたのと、文字幅を画像の横幅と文字数で調整するようにした。

字下げもしてないし、使ってるフォントファイルも等幅じゃないので右端がズレるけど、細かいことを考えると切りがないので気にしないこととする。

スクリプトは「GitHub – hide10/CreateOgp」で公開するとともに、ここにもソースコードを張っておく。

事前準備

  1. フォントファイルを用意してください。
  2. プログラム中の FONT_PATH で上記フォントを指定してください。

自分が作成する時はGoogleフォントをお借りしました。

Noto Sans Japanese – Google Fonts

使い方

引数として渡した文字列を良い感じに描画した画像を「文字列A.PNG」「文字列B.PNG」としてPNG画像に保存します。

python create_ogp.py 文字列A 文字列B

カスタマイズ

プログラム上部にある定義文字列っぽいものを弄るとカスタマイズできます。

  • OGP_WIDTH: 出力画像横幅
  • OGP_HEIGHT: 出力画像縦幅
  • BG_COLOR: 背景色
  • TEXT_WRAP_WIDTH: 折り返し幅

ソースコード

import sys, textwrap
from PIL import Image, ImageDraw, ImageFont

OGP_WIDTH = 1200
OGP_HEIGHT = 630
BG_COLOR = (0, 124, 186)
TEXT_WRAP_WIDTH = 10
FONT_PATH = "NotoSansJP-Medium.otf"

def create_ogp(text):
    # 新しいImageオブジェクトを生成
    im = Image.new("RGB", (OGP_WIDTH, OGP_HEIGHT), BG_COLOR)
    # Drawオブジェクトを生成
    draw = ImageDraw.Draw(im)

    # 画像横幅の3/4を文字数で賄うフォントサイズを計算する
    if len(text) < TEXT_WRAP_WIDTH:
        text_len = len(text)
    else:
        text_len = TEXT_WRAP_WIDTH
    font_size = OGP_WIDTH / 4 * 3 / text_len
    # フォントの指定
    font = ImageFont.truetype(FONT_PATH, int(font_size))

    # テキストを折り返す
    wrap_text = textwrap.fill(text, TEXT_WRAP_WIDTH)

    # 描画時のテキストサイズを取得
    text_width, text_height = draw.textsize(wrap_text, font)

    # 描画位置が真ん中あたりになるように調整
    position = ((OGP_WIDTH - text_width) / 2,
                (OGP_HEIGHT - text_height) / 2 - 50)
    # 文字描画
    draw.text(position, wrap_text, font=font)
    # ファイル保存
    im.save(text + ".png", "PNG")
    # 表示確認
    im.show()


for in_file in sys.argv[1:]:
    # 引数ベースでOGP画像を作成
    create_ogp(in_file)