NanoBanana Pro Edit
图片编辑与 NanoBanana Pro 生图 使用同一套 Gemini API(generateContent),只是请求里要带上原图 + 编辑指令,响应中返回编辑后的图片。参见 Gemini 官方:图片编辑。
端点:与生图相同,POST https://aiberm.com/v1beta/models/gemini-3-pro-image-preview:generateContent。
要点:contents 中传入图片 part(inlineData)+ 文本 part(编辑说明);generationConfig.responseModalities 设为 ["TEXT", "IMAGE"] 以同时拿到文字与编辑后的图;从响应 candidates[0].content.parts 里取 inline_data 即编辑结果图。
示例代码
Python 用下划线命名,REST/cURL 用驼峰命名,含义相同。
1from google import genai2from google.genai import types3from PIL import Image4from io import BytesIO5 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 图像参数与常见问题。
多张图
在 contents 的 parts 里按顺序放入多张图(每张一个 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。