NanoBanana Pro Edit

圖片編輯與 NanoBanana Pro 生圖 使用同一套 Gemini APIgenerateContent),只是請求裡要帶上原圖 + 編輯指令,回應中回傳編輯後的圖片。參見 Gemini 官方:圖片編輯

端點:與生圖相同,POST https://aiberm.com/v1beta/models/gemini-3-pro-image-preview:generateContent

重點contents 中傳入圖片 partinlineData)+ 文字 part(編輯說明);generationConfig.responseModalities 設為 ["TEXT", "IMAGE"] 以同時拿到文字與編輯後的圖;從回應 candidates[0].content.parts 裡取 inline_data 即編輯結果圖。

範例程式碼

Python 用底線命名,REST/cURL 用駝峰命名,含義相同。

1from google import genai
2from google.genai import types
3from PIL import Image
4from io import BytesIO
5 
6base_url = "https://aiberm.com"
7api_key = "YOUR_API_KEY"
8model = "gemini-3-pro-image-preview"
9output_file = "edited.png"
10 
11# 原图路径与编辑指令
12image_path = "original.png"
13edit_prompt = "给这张图加上一顶时尚的礼帽,保持其余部分不变。"
14 
15client = genai.Client(
16 api_key=api_key,
17 http_options=types.HttpOptions(api_version="v1beta", base_url=base_url),
18)
19image = Image.open(image_path)
20 
21response = client.models.generate_content(
22 model=model,
23 contents=[edit_prompt, image],
24 config=types.GenerateContentConfig(
25 response_modalities=["TEXT", "IMAGE"],
26 ),
27)
28 
29for part in response.parts:
30 if part.text is not None:
31 print(part.text)
32 elif part.inline_data is not None:
33 Image.open(BytesIO(part.inline_data.data)).save(output_file)
34 print(f"编辑后图片已保存: {output_file}")

與生圖的差異

能力生圖(NanoBanana Pro)編輯(本頁)
請求 contents僅文字(描述要產生的圖)原圖 + 文字(描述如何改圖)
generationConfig.imageConfig需要(寬高比、解析度 1K/2K/4K)編輯可不傳
responseModalities["IMAGE"]["TEXT","IMAGE"]建議 ["TEXT","IMAGE"] 以拿到編輯後圖

同一端點、同一驗證方式,僅 contents 與是否傳 imageConfig 不同。更多參數說明見 NanoBanana Pro 的 cURL 圖像參數與常見問題。

多張圖

contentsparts 裡依序放入多張圖(每張一個 inlineData part),再放一條文字編輯指令即可,模型會基於所有圖片和指令回傳結果(例如「把第一張圖的主體合成到第二張圖的背景上」)。

Python:在 contents 中傳入多個圖片物件 + 一條文字。

image1 = Image.open("photo.png")
image2 = Image.open("background.png")
response = client.models.generate_content(
    model=model,
    contents=["将第一张图的人物抠出来,放到第二张图的背景里。", image1, image2],
    config=types.GenerateContentConfig(response_modalities=["TEXT", "IMAGE"]),
)

cURL:在 contents[0].parts 裡依序寫多個 inlineData,最後寫一個 text

"contents": [{
  "parts": [
    { "inlineData": { "mimeType": "image/png", "data": "<BASE64_图1>" }},
    { "inlineData": { "mimeType": "image/png", "data": "<BASE64_图2>" }},
    { "text": "将第一张图的人物合成到第二张图的背景里。" }
  ]
}]

使用圖片 URL

介面只接受 inlineData(base64) 或透過 File API 的 fileData,不能直接傳圖片 URL。若圖在網路上,需要先下載再放入請求。

Python 範例:從 URL 下載後交給 SDK(SDK 會依需求轉為 inlineData)。

import requests
from io import BytesIO

image_url = "https://example.com/photo.jpg"
resp = requests.get(image_url)
image = Image.open(BytesIO(resp.content))

response = client.models.generate_content(
    model=model,
    contents=["给这张图加上一顶礼帽。", image],
    config=types.GenerateContentConfig(response_modalities=["TEXT", "IMAGE"]),
)

cURL:需在本機先把 URL 的圖下載並轉成 base64,再把得到的字串填入 inlineData.data