視覚的コンテキストの自動生成:Antigravityでブログのアイキャッチ作成を自動化する

アイキャッチ画像を作成するのは面倒

私は文章を書くことそのものには喜びを感じますが、それをWeb上の「記事」としてパッケージングする工程、とりわけアイキャッチ画像の選定には、常に一種の精神的摩擦を感じてきました。 (端的に言えば「めんどくさい」の一言です)

テキストエディタで文章を書いた後に、画像素材サイトを開き、検索窓にキーワードを打ち込む。あるいは、画像編集ソフトを立ち上げて文字を配置する。その瞬間、脳のモードは「論理的構築(Writer)」から「視覚的作業(Designer)」へと強制的に切り替えられます。このコンテキストスイッチこそが、執筆のフロー状態を断ち切る最大のノイズではないかと、常々感じていたのです。(繰り返しになりますが、端的に言えば「めんどくさい」の一言です。そして私には画像編集のセンスがないのであります)

Nano Banana Proを使えば、一貫性を保ったうえで、文字も含んだ画像生成ができる

これまでの画像生成AIは「きれいな絵」を作ることは得意でしたが、ブログのアイキャッチとして使うには2つの大きな壁がありました。

  1. 文字の壁: AIは意味のある文字列を描写するのが苦手で、結局あとからPhotoshopなどでタイトルを入れる必要があった。
  2. 一貫性の壁: 毎回画風が変わり、ブログとしてのブランドイメージ(トンマナ)が定まらない。

しかし、Antigravityに搭載されているモデル「Nano Banana Pro」を検証する中で、これらの壁が技術的に突破されていることに気づきました。

1. 「言葉」をそのまま描く能力

Nano Banana Proは、プロンプトに指定した日本語テキストを、驚くほど正確に画像内にレンダリングします。「上から文字を合成する」のではなく、「画像の一部として文字を生成する」のです。これにより、光の反射や質感を含んだ、違和感のないタイポグラフィが自動で完成します。

2. アバターによる「自己」の投影

さらに、自分自身の化身であるアバター(VRMキャラクターのレンダリング画像)を参照画像として渡すことで、生成される世界の中に「私」を存在させることができます。

これは単なる合成ではありません。AIは「ノートPCを操作する」という文脈を理解し、私のキャラクターにその演技をさせ、背景のサイバーパンクな世界観と馴染ませます。結果として、「テックブログである」という雰囲気を一貫して保てるようになります。

Application:ミニマリストのための自動化ワークフロー

私は以下のシンプルなワークフローを構築しました。複雑な画像編集ソフトはもう開きません。

  1. Prompting (Antigravity): 記事のタイトルと、私のキャラクター画像をAntigravityに渡します。「未来的なAIの世界で、このキャラクターがノートPCを操作している。中央に『視覚的コンテキストの自動生成』と書いて」と指示するだけです。

  2. Generation (Nano Banana Pro): 数秒後、文字入り・キャラクター入りの正方形画像が生成されます。

  3. Refining (Python Script): 16:9比率に合わせるため、Pythonスクリプト(create_eyecatch.py)を走らせます。これは単純なクロップ処理を行うだけの軽量なツールです。

完成したのが、この記事のトップにある画像です。

まとめ

私たちは今、「素材を探して加工する」時代から、「意味を伝えて生成する」時代へと移行しています。

文字入れも、キャラクターの配置も、AIが処理してくれます。これにより、執筆者は純粋な思考の出力に、より深く没入できるようになるのではないでしょうか。 (もっと記事を書きたい気持ちになれるといいな)


以下、 create_eyecatch.py の内容です。

#!/usr/bin/env python3
import sys
import os
from PIL import Image

# Usage: python3 create_eyecatch.py <input_image> <output_image>

def create_eyecatch(input_path, output_path):
    try:
        img = Image.open(input_path).convert("RGBA")
    except Exception as e:
        print(f"Error opening image: {e}")
        return

    w, h = img.size
    
    # Target 16:9
    target_ratio = 16/9
    
    # We want to keep the center, so we crop evenly from top/bottom
    # A 1024x1024 image cropped to 16:9 would be 1024x576
    
    new_h = w / target_ratio
    if new_h > h:
        # Image is too wide (unlikely for square), crop width
        new_w = h * target_ratio
        left = (w - new_w) / 2
        img = img.crop((left, 0, left + new_w, h))
    else:
        # Image is too tall (square case), crop height
        top = (h - new_h) / 2
        img = img.crop((0, top, w, top + new_h))
    
    # Resize to HD (1280x720) for consistency
    if hasattr(Image, 'Resampling'):
        resample_method = Image.Resampling.LANCZOS
    else:
        resample_method = Image.LANCZOS

    img = img.resize((1280, 720), resample_method)
    
    # Save
    img.save(output_path)
    print(f"Successfully saved 16:9 eyecatch to {output_path}")

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Usage: python3 create_eyecatch.py <input> <output>")
        sys.exit(1)
        
    input_f = sys.argv[1]
    output_f = sys.argv[2]
    
    create_eyecatch(input_f, output_f)