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