【副業実験記#10】Python+Pillowで黒フチのテキスト画像を生成してみた話

子育てSEパパのIT×AI×副業ラボ_副業実験記_10 副業実験記

つづき。


はじめに

引き続き、雑学動画自動生成ツールを自作できないか、検討してみているお話です。

今回は、画像を生成できるPythonライブラリ「Pillow」で、黒フチのテキスト画像を生成できるか検証してみた話です。

前回の記事で、MoviePyの字幕機能を使ってみましたが、どうにも自分のイメージした字幕にならなかったので、代替方法として「Pillow」が使えないか確認しました。

検証準備

Pythonのインストール

「Python」で雑学動画自動生成ツールを作るつもりなので、検証でも同様に使います。

詳細は以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

PyCharmのインストール

Pythonでの開発を楽にしてくれる統合開発環境「PyCharm」を使います。

Pythonで雑学動画自動生成ツールを作る際に使うつもりなので、検証でも同様に使います。

詳細は以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

検証用Pythonプロジェクトおよびvenvの作成

検証用「Pythonプロジェクト」を作成します。

PyCharmで簡単に作成できます。

Pythonプロジェクトを作成したら、その中で「venv」(Python仮想環境)を作成しておきます。

詳細は以下の記事にまとめていますので、ご興味ある方は、そちらをご覧ください。

Pythonパッケージのインストール

今回は、以下のパッケージを使用します。

Noパッケージ説明
1pillowPythonで画像を開いたり、加工・保存したりできる画像処理ライブラリパッケージです。

検証用Pythonプロジェクトでvenvを起動し、パッケージをインストールします。

ターミナルでコマンド実行してインストールする方法やPyCharm上で画面を操作してインストールする方法がありますが、今回は、PyCharm上で画面を操作し、venvにパッケージをインストールします。

フォントファイルの準備

テキストのフォントを指定できるようなので、フォントファイルを準備します。

今回は、Googleフォントの「Noto Sans Japanese」を使います。

検証してみた

Pillowを使用した黒フチのテキスト画像生成の流れ

今回は、以下の流れで黒フチのテキスト画像を生成します。

  1. 適当なサイズの白背景色の画像を作成する
  2. 事前に準備したフォントで適当なサイズのテキストを作成する
  3. 改行を考慮して、1行毎のサイズを計算する
  4. 改行を考慮したテキストの全体サイズを計算する
  5. 背景画像サイズとテキスト全体サイズをもとに、テキストを背景画像の中央に配置する場合の座標を計算する
  6. 黒フチ用の黒色テキストと、黒フチで囲む白色テキストを重ねて、白色背景画像に描画する
  7. 画像を保存する

Pillowを使用した黒フチのテキスト画像生成の試し

では実際に、黒フチのテキスト画像を生成してみます。

Pillowを使ったPythonサンプルコード

from PIL import Image, ImageDraw, ImageFont

# 画像サイズと背景色(白に変更)
width, height = 1280, 720
bg_color = (255, 255, 255)  # 白背景!

# フォント設定
font_path = "NotoSansJP-Regular.ttf"
font_size = 100

text = "こんにちは、\n今日はいい天気ですね。"
text_color = (255, 255, 255)       # 白文字
outline_color = (0, 0, 0)          # 黒フチ

# 画像作成
img = Image.new("RGB", (width, height), bg_color)
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(font_path, font_size)

# 改行処理
lines = text.split("\n")
line_sizes = [font.getbbox(line) for line in lines]
line_heights = [bbox[3] - bbox[1] for bbox in line_sizes]
line_widths = [bbox[2] - bbox[0] for bbox in line_sizes]

total_height = sum(line_heights)
max_width = max(line_widths)
y_start = (height - total_height) // 2

# 行ごとに描画
y = y_start
for i, line in enumerate(lines):
    bbox = font.getbbox(line)
    w = bbox[2] - bbox[0]
    h = bbox[3] - bbox[1]
    offset_x = bbox[0]
    offset_y = bbox[1]

    x = (width - w) // 2 - offset_x
    y_corrected = y - offset_y

    # 黒フチ描画(まわりを囲む)
    for dx in range(-2, 3):
        for dy in range(-2, 3):
            if dx != 0 or dy != 0:
                draw.text((x + dx, y_corrected + dy), line, font=font, fill=outline_color)

    # 白文字本体
    draw.text((x, y_corrected), line, font=font, fill=text_color)

    y += h

# 保存
img.save("output_black_outline_white_bg.jpg")

Pythonサンプルコード実行結果

D:\PyCharmProjects\PillowTest\.venv\Scripts\python.exe D:\PyCharmProjects\PillowTest\generate_text_image_with_outline.py 

プロセスは終了コード 0 で終了しました

サンプルコードで生成された画像

MoviePyの字幕よりもデザイン的にイメージに近いので、十分に、雑学動画自動生成ツールで使えると感じました。

おわりに

「Pillow」を使って、黒フチのテキスト画像を生成できることが分かりました。

動画の字幕には「Pillow」を使うのも良さそうなことが分かったので、次の技術やツールの検証に移ろうと思います。

(今回も検証用のコードは、ChatGPT(GPT-4oモデル)に出力してもらったものを微修正したものです)


今回の記事も、同じように副業に悩んでいる人、手探りで取り組んでいる人にとって、何かの参考になれば嬉しいです。

これからも記録を続けていく予定なので、よければフォローしてもらえると嬉しいです。


つづき。

タイトルとURLをコピーしました