ai-image-generator について
Google GeminiとOpenAIのAPIを使った画像生成をClaude Codeで行うためのスキルです。シーン画像、文字入り画像、透過素材、反復編集に向けたモデル選択とプロンプト作成を案内します。
主な機能
- 01画像の要件に応じたモデル選択
- 025要素のプロンプト作成法
- 03文字入り画像とバリエーション生成
- 04参照画像を使った合成
- 05Geminiでの複数ターン編集
- 06生成画像の確認と最適化
活用シーン
- 01読める文字を含むポスターやインフォグラフィックの作成
- 02商品画像をライフスタイルシーンに合成
- 031つの案から複数のビジュアルスタイルを検討
- 04透過背景のアイコンやロゴを生成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jezweb/ claude-skills --skill ai-image-generatorインストール後、Claude Code で/ai-image-generatorを入力して読み込まれたか確認します。
同梱ファイルreferences/prompting-guide.md
詳細
AI 画像生成
AI API(Google Gemini と OpenAI GPT)を使って画像を生成します。このスキルでは、Claude Code から直接プロ品質の画像を生成するためのプロンプトパターンと API の仕組みを学びます。
マネージドサービスの代替案:API キーを管理したくない場合は、ImageBot がアルバムテンプレートとブランドキットに対応したマネージド画像生成サービスを提供しています。
モデルの選択
用途に合ったモデルを選びます。
| ニーズ | モデル | 理由 |
|---|---|---|
| フォトリアルなシーン/ストックフォト | Gemini 3.1 Flash Image | 奥行き、複雑さ、環境の文脈を最も適切に表現 |
| クライアント向けの完成版シーン(より高精細) | Gemini 3 Pro Image | より高精細で、スタイルの一貫性も向上 |
| 画像内のテキスト(ポスター、コピー入りの OG 画像、インフォグラフィック) | GPT Image 2 | 複数の文字体系を含め、テキストを実用的な品質で描画 |
| 10 種類のバリエーションによるスタイル探索 | GPT Image 2 | ネイティブのバッチ生成に対応。1 つのプロンプトから、構図と配色を共有する 10 種類のバリエーションを生成 |
| 複数の参照画像を使った合成(商品+ライフスタイル) | GPT Image 2 | 参照画像間のライティング、スケール、遠近感を処理 |
| 透明なアイコン/ロゴ | GPT Image 1.5 | ネイティブ RGBA アルファに対応 — GPT Image 2 は透明にできません |
| 素早い下書き/反復作業 | Gemini 2.5 Flash Image | 無料枠(約 500 件/日) |
目安:読み取れるテキストを含む画像には、GPT Image 2 を使用します(透明度が必要な場合は GPT 1.5)。それ以外は Gemini を使用します。
モデル ID
| モデル | API ID | プロバイダー |
|---|---|---|
| Gemini 3.1 Flash Image | gemini-3.1-flash-image-preview | Google AI |
| Gemini 3 Pro Image | gemini-3-pro-image-preview | Google AI |
| Gemini 2.5 Flash Image | gemini-2.5-flash-image | Google AI |
| GPT Image 2(デフォルト) | gpt-image-2 | OpenAI |
| GPT Image 2(ChatGPT と同等の出力) | chatgpt-image-latest | OpenAI |
| GPT Image 1.5(透明度専用) | gpt-image-1.5 | OpenAI |
使用前にモデル ID を確認してください — 頻繁に変更されます。
curl -s "https://generativelanguage.googleapis.com/v1beta/models?key=$GEMINI_API_KEY" | python3 -c "import sys,json; [print(m['name']) for m in json.load(sys.stdin)['models'] if 'image' in m['name'].lower()]"
GPT Image 2 の詳細
2026-04-22 にリリースされました。利用する場面を変える 3 つの機能があります。
1. テキストを実用的な品質で描画
ポスター、見出し入りの OG 画像、ラベル付きのインフォグラフィック、UI モックアップ、料金カードに適しています。日本語、韓国語、ヒンディー語、ベンガル語などの非ラテン文字を含め、テキストを安定して描画します。Gemini から切り替える主な理由です。Gemini は読み取れるテキストをまったく描画できません。
2. 複数バリエーションのバッチ生成
1 回の呼び出しで、1 つのプロンプトから最大 10 枚の画像を生成できます。バリエーションは構図と配色を共有しつつ、細部が異なります。スタイルを決める前の探索、クライアント向けの A/B 案、すばやいアイデア出しに適しています。
3. 複数の参照画像を使った合成
商品写真、ライフスタイルシーン、ロゴなどの参照画像をプロンプトと一緒に渡します。モデルは適切なライティング、スケール、遠近感で商品をシーンに配置します。複数回の編集なしで「商品を実際の場面に配置する」ワークフローを実現できます。
モード
- Instant(デフォルト、すべてのプラン)— 計画段階を挟まずに生成します。高速で、ほとんどのケースで十分な品質です。
- Thinking(Plus/Pro/Business プラン)— 描画前にレイアウトを計画します。要素数が重要な場合(「アイコンを横一列に 3 つ」、「機能の箇条書きを 5 つ」)や、テキストを特定の領域に配置する必要がある場合に使います。複雑な構図での再生成を減らせます。
アスペクト比
超横長の 3:1 から超縦長の 1:3 までに加え、1:1、3:2、2:3、16:9、9:16 に対応します。他のモデルより幅広い範囲をカバーしており、ウェブサイトのバナー(超横長のヒーロー画像)やモバイルのストーリー形式(超縦長)に便利です。
解像度
長辺が最大 2K の標準解像度に対応します。4K はベータ版です。
生成時間
複雑なプロンプトでは最大 2 分かかります。非同期の UX を実装し、応答を待つ間に処理をブロックしないでください。進行状況を表示するか、処理を別途開始してポーリングしてください。
制約
- 透明な背景には対応していません。 PNG の透明度が必要な場合は
gpt-image-1.5を使用してください。 - エンドポイントの実行前に API Org Verification が必要な場合があります。初回の呼び出しで認証エラーが発生した場合は、OpenAI アカウントの設定で有効にしてください。
料金(1024×1024画像あたり)
| 品質 | 料金 |
|---|---|
| 低 | $0.006 |
| 中 | $0.053 |
| 高 | $0.211 |
トークン料金:入力テキストは$5/M、出力テキストは$10/M、入力画像は$8/M、出力画像は$30/Mです。
5つの要素からなるプロンプトフレームワーク
一貫した結果を得るため、次の順序でプロンプトを作成します。
1. 画像の種類
ジャンルを指定します。「フォトリアリスティックな写真」「アイソメトリックなイラスト」「フラットなベクターアイコン」
2. 主題
具体的な詳細とともに、誰または何を描くのかを指定します。「30代前半の、親しみやすく温かみのあるオーストラリア人女性。自然な笑顔」
3. 環境
場所と空間的な関係を指定します。「背後の木製棚にテラコッタ色の装飾品がある、明るくモダンな家の中」
4. 技術仕様
カメラと照明を指定します。「85mm f/2.0で撮影。自然な窓からの光。頭から肩までをフレームに収める」
5. 制約
除外するものを指定します。「フォトリアリスティック。テキスト、透かし、ロゴなし」
例(良い例と悪い例)
BAD — keyword soup:
"professional woman, spa, warm lighting, high quality, 4K"
GOOD — narrative direction:
"A professional skin treatment scene in a warm clinical setting.
A practitioner wearing blue medical gloves uses a microneedling pen
on the client's forehead. The client lies on a white treatment bed,
eyes closed, relaxed. Warm golden-hour light from a window to the
left. Terracotta-toned wall visible in the background. Shot at
85mm f/2.0, shallow depth of field. No text, no watermarks."
ワークフロー
1. 画像の必要性を判断する
| 用途 | アスペクト比 | モデル |
|---|---|---|
| ヒーローバナー(テキストなし) | 16:9 または 21:9 | Gemini |
| 見出しコピー入りのヒーローバナー | 16:9 または 3:1 の超ワイド | GPT Image 2 |
| サービスカード | 4:3 または 3:4 | Gemini |
| プロフィール/アバター | 1:1 | Gemini |
| アイコン/バッジ(透明) | 1:1 | GPT Image 1.5 |
| OG/ソーシャル共有(テキストなし) | 1.91:1 | Gemini |
| コピー入りのOG/ソーシャル共有 | 1.91:1 | GPT Image 2 |
| ポスター/インフォグラフィック/料金カード/文字要素の多い画像全般 | さまざま | GPT Image 2 |
| スタイルの検討(1つのコンセプトから10種類のバリエーションを作成) | 任意 | GPT Image 2(バッチ) |
| Instagram投稿 | 1:1 または 4:5 | Gemini |
| モバイル向けヒーロー画像 | 9:16 | Gemini |
2. プロンプトを作成する
5つの要素からなるフレームワークを使用します。写真撮影のパラメーターについて詳しくは、references/prompting-guide.mdを参照してください。
3. API経由で生成する
Gemini(Python — シェルのエスケープを正しく処理)
python3 << 'PYEOF'
import json, base64, urllib.request, os, sys
GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
if not GEMINI_API_KEY:
print("Set GEMINI_API_KEY environment variable"); sys.exit(1)
model = "gemini-3.1-flash-image-preview"
url = f"https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key={GEMINI_API_KEY}"
prompt = """A professional photograph of a modern co-working space in
Newcastle, Australia. Natural light floods through floor-to-ceiling
windows. Three people collaborate at a standing desk — one pointing
at a laptop screen. Exposed brick wall, potted fiddle-leaf fig,
coffee cups on the desk. Shot at 35mm f/4.0, environmental portrait
style. No text, no watermarks, no logos."""
payload = json.dumps({
"contents": [{"parts": [{"text": prompt}]}],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"],
"temperature": 0.8
}
}).encode()
req = urllib.request.Request(url, data=payload, headers={
"Content-Type": "application/json",
"User-Agent": "ImageGen/1.0"
})
resp = urllib.request.urlopen(req, timeout=120)
result = json.loads(resp.read())
# Extract image from response
for part in result["candidates"][0]["content"]["parts"]:
if "inlineData" in part:
img_data = base64.b64decode(part["inlineData"]["data"])
output_path = "hero-image.png"
with open(output_path, "wb") as f:
f.write(img_data)
print(f"Saved: {output_path} ({len(img_data):,} bytes)")
break
PYEOF
GPT Image 1.5 — 透明なアイコン
透明なPNGの場合は、特にgpt-image-1.5を使用します。GPT Image 2では透明にできません。
python3 << 'PYEOF'
import json, base64, urllib.request, os, sys
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
if not OPENAI_API_KEY:
print("Set OPENAI_API_KEY environment variable"); sys.exit(1)
url = "https://api.openai.com/v1/images/generations"
payload = json.dumps({
"model": "gpt-image-1.5",
"prompt": "A minimal, clean plumbing wrench icon. Flat design, single consistent stroke weight, modern style. On a transparent background.",
"n": 1,
"size": "1024x1024",
"background": "transparent",
"output_format": "png"
}).encode()
req = urllib.request.Request(url, data=payload, headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {OPENAI_API_KEY}"
})
resp = urllib.request.urlopen(req, timeout=120)
result = json.loads(resp.read())
img_data = base64.b64decode(result["data"][0]["b64_json"])
with open("icon-wrench.png", "wb") as f:
f.write(img_data)
print(f"Saved: icon-wrench.png ({len(img_data):,} bytes)")
PYEOF
GPT Image 2 — テキスト量の多い画像またはバッチでのバリエーション
テキストを読みやすく表示する必要がある場合、または1回の呼び出しで10種類のバリエーションを作成する場合は、gpt-image-2を使用します。透明には対応していません — 透明な背景が必要な場合は、上記の1.5を使用してください。
python3 << 'PYEOF'
import json, base64, urllib.request, os, sys, pathlib
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
if not OPENAI_API_KEY:
print("Set OPENAI_API_KEY environment variable"); sys.exit(1)
url = "https://api.openai.com/v1/images/generations"
# 10-variation batch of a pricing card with rendered text
payload = json.dumps({
"model": "gpt-image-2",
"prompt": (
"A modern pricing card for a web hosting plan. "
"Headline 'Starter' in bold sans-serif. "
"Price '$29/month' directly below in large type. "
"Three feature lines: 'Unlimited bandwidth', 'SSD storage', 'Free SSL'. "
"Clean flat design, soft drop shadow, deep blue accent colour. "
"White card on light grey background."
),
"n": 10,
"size": "1024x1024",
"quality": "medium",
"output_format": "png"
}).encode()
req = urllib.request.Request(url, data=payload, headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {OPENAI_API_KEY}"
})
# Timeout: up to 2 min for complex prompts
resp = urllib.request.urlopen(req, timeout=180)
result = json.loads(resp.read())
pathlib.Path("variations").mkdir(exist_ok=True)
for i, item in enumerate(result["data"], 1):
img_data = base64.b64decode(item["b64_json"])
path = f"variations/pricing-card-{i:02d}.png"
with open(path, "wb") as f:
f.write(img_data)
print(f"Saved: {path} ({len(img_data):,} bytes)")
print(f"\nGenerated {len(result['data'])} variants. Pick the best; delete the rest.")
PYEOF
バッチワークフロー:10種類を生成 → 並べて確認 → 1〜2種類を選択 → 必要に応じて、採用した方向性に合わせてプロンプトを絞り込み、再生成します。1回で生成してから反復するよりも高速です。
4. 保存して最適化する
生成した画像を.jez/artifacts/またはユーザー指定のパスに保存します。
後処理(任意):
# Convert to WebP for web use
python3 -c "
from PIL import Image
img = Image.open('hero-image.png')
img.save('hero-image.webp', 'WEBP', quality=85)
print(f'WebP: {img.size[0]}x{img.size[1]}')
"
# Trim whitespace from transparent icons
python3 -c "
from PIL import Image
img = Image.open('icon.png')
trimmed = img.crop(img.getbbox())
trimmed.save('icon-trimmed.png')
"
5. 品質を確認する(任意)
生成した画像をビジョンモデルに送り、品質を確認します。
# Send to Gemini Flash for critique
critique_prompt = """Review this image for:
1. AI artifacts (extra fingers, floating objects, text errors)
2. Technical accuracy (wrong equipment, unsafe positioning)
3. Composition issues (awkward cropping, cluttered background)
4. Style consistency with a professional stock photo
List any issues found, or say 'PASS' if the image is production-ready."""
問題が見つかった場合は、元のプロンプトに除外指示として追加し、再生成します。
複数ターンでの編集
Geminiでは、会話のターンをまたいで生成済みの画像を編集できます。重要な要件は、モデルの応答から思考署名を保持することです。
# Turn 1: Generate base image
contents = [{"role": "user", "parts": [{"text": "Scene prompt..."}]}]
# The response includes thoughtSignature on parts — preserve them ALL
# Turn 2: Edit the image
contents = [
{"role": "user", "parts": [{"text": "Original prompt"}]},
{"role": "model", "parts": response_parts_with_signatures}, # Keep intact
{"role": "user", "parts": [{"text": "Edit: change the wall colour to blue. Keep everything else exactly the same."}]}
]
編集プロンプトのパターン:変更する内容だけでなく、変更せずに維持する内容を必ず指定します。指定されていない要素は、モデルが自由に変更できるものとして扱います。
GOOD: "Edit this image: keep the people, desk, and window unchanged.
Only change: wall colour from terracotta to ocean blue."
BAD: "Now make the wall blue."
(Model may change everything else too)
APIキーの設定
| プロバイダー | キーの取得先 | 環境変数 |
|---|---|---|
| Google Gemini | aistudio.google.com | GEMINI_API_KEY |
| OpenAI | platform.openai.com | OPENAI_API_KEY |
export GEMINI_API_KEY="your-key-here"
export OPENAI_API_KEY="your-key-here"
よくある間違い
| 間違い | 修正方法 |
|---|---|
| Gemini のプロンプトに curl を使う | Python を使います。アポストロフィがあるとシェルのエスケープがうまく機能しません |
| 「美しく、プロフェッショナルで、高品質」 | 「85mm f/1.8、ゴールデンアワーの光」のように具体的な仕様を指定します |
| 除外するものを指定しない | 常に「テキスト、透かし、ロゴなし」で終えます |
| Gemini に透過 PNG をリクエストする | Gemini は透過に対応していません。background: "transparent" を指定して GPT Image 1.5 を使います |
| GPT Image 2 に透過 PNG をリクエストする | GPT Image 2 は透過に対応していません。この場合に限り gpt-image-1.5 に切り替えます |
| 画像内のテキストに GPT Image 1.5 を使う | GPT Image 1.5 のテキスト描画は安定しません。読み取れるテキストには gpt-image-2 を使います |
| GPT Image 2 へのリクエストをタイムアウトさせる | 複雑なプロンプトでは生成に最大 2 分かかることがあります。タイムアウトを 180 秒に設定し、非同期 UX を構築します |
| オーストラリアの企業にアメリカのデフォルト設定を使う | 「Australian」と、現地の建築や植生を明示的に指定します |
| モデル ID に汎用的なデータを使う | 現在のモデル ID を確認します。頻繁に変わります |