著者注:Nano Banana Pro が Seed パラメータをサポートしていない技術的な理由と、満足のいく生成結果が得られた際に、それをバッチ処理で再現するための現実的で効果的な代替案を深く掘り下げます。
あるユーザーからの切実なフィードバック:「画像を加工して生成したのですが、その結果にとても満足しています。これと全く同じ効果で、他の画像も数枚まとめて作りたいのですが、どうすればいいでしょうか?毎回生成される結果が微妙に違ってしまうんです。」これは、Nano Banana Pro で一括画像生成(Image-to-Image)を行う際の典型的な悩みです。満足のいく画像を参考画像として入れても、効果が一致しない――理由はシンプルです。Nano Banana Pro 公式が Seed パラメータをサポートしていないため、生成のたびに全く新しいランダムな推論プロセスが走るからです。
核心となる価値:この記事では回り道をせず、なぜ Seed がないのか、なぜ参考画像だけでは不十分なのかを明確に解説した上で、Seed がなくても満足のいく効果を可能な限り再現するための「5つの実効性のある代替案」を提案します。

まずは明確に:なぜ Nano Banana Pro には Seed がないのか?
公式パラメータ一覧
Nano Banana Pro(gemini-3-pro-image-preview)の generationConfig は以下のパラメータをサポートしています:
| パラメータ名 | 役割 | 例 |
|---|---|---|
responseModalities |
出力タイプの指定 | ["IMAGE"] |
resolution |
画像解像度 | "1K" / "2K" / "4K" |
aspectRatio |
アスペクト比 | "16:9" / "1:1" / "2:3" |
candidateCount |
同時生成される候補数 | 1(画像生成は 1 に固定) |
temperature |
テキスト部分のランダム性(画像には影響しません) | 1.0(デフォルト推奨) |
seed パラメータ:リストに含まれておらず、公式にはサポートされていません。
コード内で seed を渡そうとすると、直接エラーになります:
# ❌ エラーになります:Unknown field 'seed' in GenerationConfig
response = model.generate_content(
prompt,
generation_config=genai.GenerationConfig(
response_modalities=["IMAGE"],
seed=42 # ← エラー!公式はこのパラメータをサポートしていません
)
)
Gemini Image API vs Imagen API:2つの異なるサービス
Google の公式ドキュメントに seed パラメータがあるのを見かけた方もいるかもしれませんが、それは Imagen API(Vertex AI 上の画像生成サービス)のことであり、Nano Banana Pro ではありません。
| 比較項目 | Nano Banana Pro | Imagen API(Vertex AI) |
|---|---|---|
| モデル ID | gemini-3-pro-image-preview |
imagen-3.0-generate-002 |
| Seed サポート | ❌ 非対応 | ✅ 対応(seed パラメータ) |
| API エンドポイント | Google Generative AI | Vertex AI |
| 呼び出し SDK | google-generativeai |
google-cloud-aiplatform |
| 画質 | 最高レベルのリアリズム、文字レンダリングに強い | 高品質、多様なスタイル |
| 価格(APIYI) | $0.05/枚 | 別途価格設定 |
結論:どうしても Seed による再現性が必要な場合は、Nano Banana Pro で存在しないパラメータをいじるのではなく、Imagen API に切り替えるべきです。APIYI などのサードパーティプロキシは Imagen API をサポートしておらず、この API は公式サイトの KEY でのみ利用可能です。
なぜ参考画像だけでは不十分なのか?
満足のいく生成結果を参考画像として再度入力するのは、最も直感的なアイデアですが、実際の効果は「いまいち」です。その根本的な理由は以下の通りです:
Nano Banana Pro は参考画像を「コピー用のテンプレート」ではなく「スタイルの参考」として理解します。「この画像をもう少し暗くして」と参考画像をアップロードすると、モデルは次のように動きます:
- 参考画像の全体的なスタイル、構成、内容を分析する
- 「もう少し暗くして」という指示を再解釈する
- 指示に従った新しい画像をゼロから生成する
このプロセスには毎回ランダム性が伴うため、「ほんの少し暗く」という指示が、1回目はちょうど良い 15% の輝度低下だったとしても、2回目は 50% になり、3回目は全く異なるスタイルになる可能性があります。

5 つの代替案:最も直接的な方法から根本的な解決策まで
案1:プロンプトの精密な数値化(即効性が最も高い)
問題シーン:「画像をほんの少し暗くして」→ 結果が暗すぎたり、逆に明るすぎたりすることがある。
根本的な原因は「ほんの少し」という表現が曖昧すぎることにあります。Nano Banana Pro は、「ほんの少し」に対する理解が毎回一致することを保証できません。解決策は、曖昧な表現を数値に置き換えることです。
❌ 曖昧なプロンプト:
"Make this image slightly darker"
(この画像をほんの少し暗くして)
✅ 数値化したプロンプト:
"Apply a subtle darkening effect equivalent to reducing brightness by
approximately 15-20%. The image should feel slightly moodier but all
details must remain clearly visible. Do NOT go dark. The result should
be close to: brightness 85% of original, contrast unchanged."
(明るさを約15〜20%下げるのに相当する、わずかな暗転効果を適用してください。
画像は少し情緒的な雰囲気にする必要がありますが、すべてのディテールははっきりと
見える状態を維持してください。暗くしすぎないでください。結果は、元の明るさの
85%程度、コントラストは変更なしの状態に近づけてください。)
よくある調整の数値化の書き方:
明るさの調整:
"brightness at 85% of original" (15%下げる)
"increase brightness by 10%, keep contrast" (明るさを10%上げる)
色調の調整:
"add a very subtle warm orange tint, color shift about 10%"
"slight cool blue cast, saturation unchanged"
スタイルの強度:
"apply film grain texture at 20% opacity, barely noticeable"
"add very subtle vignette at corners, 15% strength"
💡 重要なテクニック:プロンプトの中で "approximately X%"(約X%)、"not exceeding Y%"(Y%を超えない)、"subtle/barely noticeable"(わずかな/かろうじて気づく程度)といった程度の限定詞を使い、モデルに対して変化の幅の境界を明確に伝えます。
案2:満足のいく結果 + 精密なプロンプトの組み合わせ(推奨される第一選択)
単に参照画像をアップロードするだけでは効果が不安定ですが、参照画像 + 数値化したプロンプトの組み合わせにすると、効果は格段に向上します。
import google.generativeai as genai
import base64
genai.configure(
api_key="YOUR_APIYI_KEY",
client_options={"api_endpoint": "vip.apiyi.com"} # APIYI $0.05/回
)
model = genai.GenerativeModel("gemini-3-pro-image-preview")
def apply_consistent_effect(
source_image_path: str, # 処理する新しい画像
approved_result_path: str, # 最初に満足のいく結果が得られた画像(スタイル参照用)
effect_description: str, # 精密に数値化した効果の説明
output_path: str
) -> str:
"""
満足のいく効果を新しい画像に再現する
参照画像 + 精密な数値化プロンプトの二重アンカーを使用
"""
# 2枚の画像を読み込む
with open(source_image_path, "rb") as f:
source_data = base64.b64encode(f.read()).decode()
with open(approved_result_path, "rb") as f:
approved_data = base64.b64encode(f.read()).decode()
prompt = f"""
I have two reference images:
- Image 1 (source): The new image I want to process
- Image 2 (approved result): A previous edit I was very happy with
Please apply the SAME effect from Image 2 to Image 1.
The effect is: {effect_description}
Critical instructions:
- The degree of change should match Image 2 EXACTLY
- Do not over-apply the effect
- Keep all other image properties unchanged
- If unsure about intensity, err on the side of LESS change
"""
response = model.generate_content(
[
{"inline_data": {"mime_type": "image/jpeg", "data": source_data}},
{"inline_data": {"mime_type": "image/jpeg", "data": approved_data}},
prompt
],
generation_config=genai.GenerationConfig(
response_modalities=["IMAGE"],
resolution="4K",
aspect_ratio="1:1"
)
)
for part in response.candidates[0].content.parts:
if part.inline_data and part.inline_data.mime_type.startswith("image/"):
with open(output_path, "wb") as f:
f.write(base64.b64decode(part.inline_data.data))
return output_path
return None
# 使用例
result = apply_consistent_effect(
source_image_path="new_product_photo.jpg",
approved_result_path="approved_dark_edit.jpg",
effect_description="subtle darkening, brightness reduced by approximately 15-20%, "
"image should be slightly moodier but all details clearly visible",
output_path="output_consistent.png"
)
# 1回あたり $0.05(APIYI apiyi.com)
🚀 実測アドバイス:この方法は、一貫性を「完全にランダム」から「高い確率で期待通り」に引き上げますが、それでも100%ではありません。1バッチごとに2〜3個のバリエーションを同時に生成し(
candidateCountはエラーになる場合があるため、複数回呼び出しを推奨)、人間が最も近いものを選ぶのがおすすめです。APIYI なら1回 $0.05 という低コストなので、複数回のサンプリングも現実的です。
案3:マルチサンプリング + バッチフィルタリング(大量処理向け)
現在の状況下で最も現実的なプランは、各画像に対して3〜5個のバリエーションを生成し、人間またはプログラムで最も近いものを選別することです。
import asyncio
import base64
import os
import google.generativeai as genai
genai.configure(
api_key="YOUR_APIYI_KEY",
client_options={"api_endpoint": "vip.apiyi.com"} # APIYI $0.05/回
)
model = genai.GenerativeModel("gemini-3-pro-image-preview")
EFFECT_PROMPT = """
Apply subtle darkening effect:
- Brightness: approximately 85% of original (reduce by ~15%)
- Mood: slightly darker, more atmospheric
- Details: all elements must remain clearly visible
- Do NOT: make it too dark, change colors dramatically, lose details
This is a subtle, refined adjustment - less is more.
"""
async def generate_variants(image_path: str, n_variants: int = 3) -> list:
"""同じ画像に対して n 個のバリエーションを生成し、選別用に提供する"""
with open(image_path, "rb") as f:
img_data = base64.b64encode(f.read()).decode()
async def one_call(i: int) -> str:
output = image_path.replace(".jpg", f"_v{i+1}.png")
loop = asyncio.get_event_loop()
try:
response = await loop.run_in_executor(None, lambda: model.generate_content(
[{"inline_data": {"mime_type": "image/jpeg", "data": img_data}},
EFFECT_PROMPT],
generation_config=genai.GenerationConfig(
response_modalities=["IMAGE"],
resolution="4K"
)
))
for part in response.candidates[0].content.parts:
if part.inline_data:
with open(output, "wb") as f:
f.write(base64.b64decode(part.inline_data.data))
return output
except Exception as e:
print(f" バリエーション {i+1} 失敗: {e}")
return None
# 並列で複数のバリエーションを生成
results = await asyncio.gather(*[one_call(i) for i in range(n_variants)])
return [r for r in results if r]
async def batch_process(image_list: list, n_variants: int = 3):
"""複数の画像をバッチ処理し、各画像に対して複数のバリエーションを生成する"""
for img_path in image_list:
print(f"\n処理中: {img_path}")
variants = await generate_variants(img_path, n_variants)
cost = len(variants) * 0.05
print(f" {len(variants)} 個のバリエーションを生成、コスト ${cost:.2f}(APIYI)")
print(f" ファイル: {variants}")
print(f" → 最も満足のいくバリエーションを手動で選択してください")
# 例:5枚の画像を処理し、各3個のバリエーションを生成
images = ["photo_01.jpg", "photo_02.jpg", "photo_03.jpg", "photo_04.jpg", "photo_05.jpg"]
asyncio.run(batch_process(images, n_variants=3))
# 5枚 × 3バリエーション = 15回呼び出し、APIYI 総コスト $0.75
コスト見積もり:
| 規模 | バリエーション数 | 総呼び出し回数 | APIYI コスト |
|---|---|---|---|
| 10 枚 | 各 3 個 | 30 回 | $1.50 |
| 50 枚 | 各 3 個 | 150 回 | $7.50 |
| 100 枚 | 各 2 個 | 200 回 | $10.00 |
案4:Seed をサポートするモデルへの切り替え(根本的な解決策)
業務で正確な再現性が必要な場合、最も徹底した解決策は、ネイティブで Seed をサポートしているモデルに切り替えることです。
Imagen API (Vertex AI) —— 同じ Google 傘下で、Seed をサポートしています:
from google.cloud import aiplatform
from vertexai.preview.vision_models import ImageGenerationModel
# Imagen API は seed パラメータをサポート
model = ImageGenerationModel.from_pretrained("imagen-3.0-generate-002")
response = model.generate_images(
prompt="your prompt here",
seed=42, # ✅ 公式にサポート!
number_of_images=1,
add_watermark=False # seed 使用時は透かしをオフにする必要があります
)
# 同じ seed + 同じ prompt → 同じ結果(高い再現性)
Stable Diffusion / Flux —— 完璧な Seed エコシステム:
# APIYI (apiyi.com) 経由で Flux にアクセス、seed をサポート
import requests
response = requests.post(
"https://vip.apiyi.com/v1/images/generations",
headers={"Authorization": "Bearer YOUR_APIYI_KEY"},
json={
"model": "flux-dev", # または flux-schnell
"prompt": "your prompt",
"seed": 12345, # ✅ 完全な seed サポート
"width": 1024,
"height": 1024
}
)
# seed を固定 → 一貫性のあるベース画像を大量生成可能
案5:画像の後処理(最高の精度と安定性)
もしニーズが「画像に対して固定の明るさ/色調調整をバッチ適用する」(例:一律に15%暗くする)といったものであれば、AI 生成を使うのは最適解ではありません。**画像の後処理(ポストプロセッシング)**こそが正しいツールです。
from PIL import Image, ImageEnhance
import os
def batch_darken(input_dir: str, output_dir: str, brightness_factor: float = 0.85):
"""
明るさを精密にバッチ調整する
brightness_factor: 0.85 = 15%低下、完全に再現可能、ランダム性ゼロ
"""
os.makedirs(output_dir, exist_ok=True)
files = [f for f in os.listdir(input_dir) if f.lower().endswith(('.jpg', '.png', '.webp'))]
for filename in files:
img = Image.open(os.path.join(input_dir, filename))
enhancer = ImageEnhance.Brightness(img)
# 明るさを精密にコントロール、毎回全く同じ結果が得られる
darkened = enhancer.enhance(brightness_factor)
darkened.save(os.path.join(output_dir, filename))
print(f"✓ {filename} → 明るさ {brightness_factor*100:.0f}%")
# バッチ処理、APIコストゼロ、100%再現可能
batch_darken("input_images/", "darkened_output/", brightness_factor=0.85)
適用シーンの比較:
| 調整タイプ | 推奨ツール | 理由 |
|---|---|---|
| 明るさ/コントラスト/彩度の統一 | PIL / Photoshop バッチ処理 | 精密、再現可能、コストゼロ |
| 色調フィルターの統一(暖色/寒色) | PIL / LUT フィルター | 100% の一貫性 |
| 複雑なスタイル転送(背景変更/被写体変更) | Nano Banana Pro | AI の真価が発揮される領域 |
| 精密な再現が必要かつクリエイティブな変化を含む | Imagen API(Seed あり) | 品質と一貫性の両立 |
🎯 率直なアドバイス:単に「画像を15%暗くしたい」だけなら、PIL の
ImageEnhance.Brightnessを使ってください。コストゼロ、100%の一貫性、たった一行のコードで解決します。AI 画像生成の価値は、複雑な内容の理解とクリエイティブな生成にあり、精密なパラメータ調整にあるわけではありません。
主要AI画像モデルのSeed対応比較
| モデル | Seed対応 | 再現の安定性 | 備考 |
|---|---|---|---|
| Nano Banana Pro | ❌ 非対応 | 低(毎回ランダム) | 参考画像+プロンプトで一部改善可能 |
| Imagen API | ✅ 公式対応 | 高 | 同一のSeedとプロンプトで再現可能 |
| Stable Diffusion | ✅ 完全対応 | 非常に高い | オープンソースエコシステム、セルフホストまたはクラウド |
| Flux Dev/Pro | ✅ 対応 | 高 | 写実性が高く、API連携が可能 |
| Midjourney | ✅ --seed パラメータ |
中(参考レベル) | 同一Seedでスタイルは近似するが完全一致はしない |
| DALL-E 3 | ❌ 非対応 | 低 | Nano Banana Proと同様の制限あり |
💡 プラットフォームの推奨事項:APIYI(apiyi.com)を通じて、Nano Banana Pro、Flux、Stable Diffusionなどの複数の画像モデルに一括でアクセスできます。同一のAPIキーでモデルを切り替えられるため、Seed値の要否に応じて柔軟に選択できて便利です。
