
アイキャッチ画像を作成するのは面倒
私は文章を書くことそのものには喜びを感じますが、それをWeb上の「記事」としてパッケージングする工程、とりわけアイキャッチ画像の選定には、常に一種の精神的摩擦を感じてきました。 (端的に言えば「めんどくさい」の一言です)
テキストエディタで文章を書いた後に、画像素材サイトを開き、検索窓にキーワードを打ち込む。あるいは、画像編集ソフトを立ち上げて文字を配置する。その瞬間、脳のモードは「論理的構築(Writer)」から「視覚的作業(Designer)」へと強制的に切り替えられます。このコンテキストスイッチこそが、執筆のフロー状態を断ち切る最大のノイズではないかと、常々感じていたのです。(繰り返しになりますが、端的に言えば「めんどくさい」の一言です。そして私には画像編集のセンスがないのであります)
Nano Banana Proを使えば、一貫性を保ったうえで、文字も含んだ画像生成ができる
これまでの画像生成AIは「きれいな絵」を作ることは得意でしたが、ブログのアイキャッチとして使うには2つの大きな壁がありました。
- 文字の壁: AIは意味のある文字列を描写するのが苦手で、結局あとからPhotoshopなどでタイトルを入れる必要があった。
- 一貫性の壁: 毎回画風が変わり、ブログとしてのブランドイメージ(トンマナ)が定まらない。
しかし、Antigravityに搭載されているモデル「Nano Banana Pro」を検証する中で、これらの壁が技術的に突破されていることに気づきました。
1. 「言葉」をそのまま描く能力
Nano Banana Proは、プロンプトに指定した日本語テキストを、驚くほど正確に画像内にレンダリングします。「上から文字を合成する」のではなく、「画像の一部として文字を生成する」のです。これにより、光の反射や質感を含んだ、違和感のないタイポグラフィが自動で完成します。
2. アバターによる「自己」の投影
さらに、自分自身の化身であるアバター(VRMキャラクターのレンダリング画像)を参照画像として渡すことで、生成される世界の中に「私」を存在させることができます。
これは単なる合成ではありません。AIは「ノートPCを操作する」という文脈を理解し、私のキャラクターにその演技をさせ、背景のサイバーパンクな世界観と馴染ませます。結果として、「テックブログである」という雰囲気を一貫して保てるようになります。
Application:ミニマリストのための自動化ワークフロー
私は以下のシンプルなワークフローを構築しました。複雑な画像編集ソフトはもう開きません。
Prompting (Antigravity): 記事のタイトルと、私のキャラクター画像をAntigravityに渡します。「未来的なAIの世界で、このキャラクターがノートPCを操作している。中央に『視覚的コンテキストの自動生成』と書いて」と指示するだけです。
Generation (Nano Banana Pro): 数秒後、文字入り・キャラクター入りの正方形画像が生成されます。
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)