【Python】Pillowで画像に文字を描画する:日本語フォントの指定と配置

画像処理ライブラリPillowを使用すれば、ベースとなる写真にタイトルや日付を合成し、SNS用のアイキャッチ画像やイベント告知バナーを自動生成することが可能です。

ここでは、「イベント告知用のポスター画像」 を生成するシナリオを例に、日本語フォントを正しく読み込んで文字を合成する実装方法を解説します。

目次

実行可能なサンプルコード

このコードは、背景画像の上に「Grand Opening」という告知テキストと、開催日を異なるサイズ・色で描画します。 OS(Windows/Mac/Linux)ごとに標準的な日本語フォントを自動選択するロジックを含んでいます。

from PIL import Image, ImageFont, ImageDraw
import os
import platform

def create_event_poster():
    # 1. ファイル名と設定の定義
    base_bg_file = "event_background.jpg"
    output_file = "event_poster_completed.jpg"
    
    # 動作確認用に背景画像を生成(お手持ちの画像がある場合は不要)
    if not os.path.exists(base_bg_file):
        _generate_dummy_background(base_bg_file)

    try:
        # 2. 画像を開く
        # convert("RGBA")としておくと、透過処理などにも対応しやすくなります
        with Image.open(base_bg_file) as img:
            canvas = img.convert("RGBA")
            draw = ImageDraw.Draw(canvas)
            
            # 画像サイズを取得(配置の計算に使用)
            img_w, img_h = canvas.size

            # 3. フォント設定の準備
            # メインタイトル用とサブテキスト用でサイズを変えます
            font_path = _get_system_font_path()
            
            # フォントオブジェクトの生成
            try:
                title_font = ImageFont.truetype(font_path, 80) # 大文字
                sub_font = ImageFont.truetype(font_path, 40)   # 小文字
            except IOError:
                print("指定フォントが見つからないため、デフォルトフォントを使用します。日本語は表示できません。")
                title_font = ImageFont.load_default()
                sub_font = ImageFont.load_default()

            # 4. 文字列の描画処理
            
            # --- メインタイトル ---
            main_text = "Grand Opening"
            main_color = (255, 255, 0, 255) # 黄色 (R, G, B, Alpha)
            
            # 座標指定 (x=50, y=50)
            draw.text((50, 50), main_text, font=title_font, fill=main_color)

            # --- サブ情報(日付) ---
            date_text = "2026.04.01 (Sat) 10:00 AM"
            date_color = (255, 255, 255, 255) # 白色
            
            # 座標指定 (x=50, y=150)
            draw.text((50, 150), date_text, font=sub_font, fill=date_color)

            # 5. 画像の保存
            # JPEGで保存する場合はRGBに戻してから保存します
            final_img = canvas.convert("RGB")
            final_img.save(output_file, quality=95)
            print(f"ポスター画像を生成しました: {output_file}")

    except Exception as e:
        print(f"予期せぬエラーが発生しました: {e}")

def _get_system_font_path():
    """OS環境に合わせて日本語対応フォントのパスを返す関数"""
    pf = platform.system()
    if pf == "Windows":
        return "C:\\Windows\\Fonts\\meiryo.ttc" # メイリオ
    elif pf == "Darwin": # macOS
        return "/System/Library/Fonts/ヒラギノ角ゴ W6.ttc"
    else:
        # Linux (Ubuntu等)
        return "/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc"

def _generate_dummy_background(filename):
    """テスト用の暗い背景画像を作成"""
    img = Image.new("RGB", (800, 400), color=(20, 20, 60)) # ダークブルー
    img.save(filename)

if __name__ == "__main__":
    create_event_poster()

解説:日本語フォント描画のポイント

1. ImageFont.truetype の必須性

Pillowのデフォルトフォントは英数字のみ対応しており、サイズ変更もできません。日本語を描画したり、文字サイズを自由に変えたりする場合は、必ず TrueTypeフォント(.ttf / .ttc) のパスを指定してフォントオブジェクトを生成する必要があります。

2. カラー指定のタプル

fill 引数には (R, G, B) または (R, G, B, Alpha) のタプルを指定します。

  • 例: (255, 0, 0) -> 赤
  • 例: (255, 255, 255) -> 白

3. Drawオブジェクトの役割

draw = ImageDraw.Draw(img) で生成したオブジェクトに対して draw.text() を実行することで、元の img オブジェクトのピクセルデータが直接書き換えられます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次