Modifica NanoBanana Pro
La modifica delle immagini usa la stessa Gemini API (generateContent) della generazione di immagini NanoBanana Pro. Invia l’immagine originale + l’istruzione di modifica nella richiesta e ricevi l’immagine modificata nella risposta. Vedi documentazione Gemini: Image editing.
Endpoint: Uguale alla generazione: POST https://aiberm.com/v1beta/models/gemini-3-pro-image-preview:generateContent.
Punti chiave: Inserisci una parte immagine (inlineData) e una parte testo (istruzione di modifica) in contents; imposta generationConfig.responseModalities su ["TEXT", "IMAGE"] per ottenere l’immagine modificata; leggi il risultato da candidates[0].content.parts → inline_data.
Codice di esempio
Python usa snake_case; REST/cURL usa camelCase. Stesso significato.
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 11image_path = "original.png"12edit_prompt = "Add a stylish top hat to this image, keep the rest unchanged."13 14client = genai.Client(15 api_key=api_key,16 http_options=types.HttpOptions(api_version="v1beta", base_url=base_url),17)18image = Image.open(image_path)19 20response = client.models.generate_content(21 model=model,22 contents=[edit_prompt, image],23 config=types.GenerateContentConfig(24 response_modalities=["TEXT", "IMAGE"],25 ),26)27 28for part in response.parts:29 if part.text is not None:30 print(part.text)31 elif part.inline_data is not None:32 Image.open(BytesIO(part.inline_data.data)).save(output_file)33 print(f"Saved edited image: {output_file}")Modifica vs generazione
| Genera (NanoBanana Pro) | Modifica (questa pagina) | |
|---|---|---|
contents | Solo testo (descrivi l’immagine da creare) | Immagine + testo (descrivi come modificare) |
generationConfig.imageConfig | Obbligatorio (rapporto d’aspetto, 1K/2K/4K) | Facoltativo per la modifica |
responseModalities | ["IMAGE"] o ["TEXT","IMAGE"] | In genere ["TEXT","IMAGE"] |
Stesso endpoint e stessa autenticazione; differiscono solo contents e se passi imageConfig. Per altri parametri vedi NanoBanana Pro.
Più immagini
Inserisci più parti immagine in contents.parts (un inlineData per immagine), poi una parte di testo con l’istruzione di modifica. Il modello usa tutte le immagini e l’istruzione per produrre il risultato (ad es. “componi il soggetto della prima immagine sullo sfondo della seconda”).
Python: passa più oggetti immagine e un testo in contents.
image1 = Image.open("photo.png")
image2 = Image.open("background.png")
response = client.models.generate_content(
model=model,
contents=["Place the person from the first image onto the background of the second.", image1, image2],
config=types.GenerateContentConfig(response_modalities=["TEXT", "IMAGE"]),
)
cURL: in contents[0].parts, aggiungi un inlineData per immagine, poi un text.
"contents": [{
"parts": [
{ "inlineData": { "mimeType": "image/png", "data": "<BASE64_IMAGE1>" }},
{ "inlineData": { "mimeType": "image/png", "data": "<BASE64_IMAGE2>" }},
{ "text": "Place the person from the first image onto the background of the second." }
]
}]
Usare un URL di immagine
L’API accetta solo inlineData (base64) o fileData (tramite File API); non accetta direttamente URL di immagini. Per le immagini a un URL, scaricale prima e poi includile nella richiesta.
Python: scarica dall’URL e passa l’immagine all’SDK (l’SDK la codificherà se necessario).
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=["Add a top hat to this image.", image],
config=types.GenerateContentConfig(response_modalities=["TEXT", "IMAGE"]),
)
cURL: scarica l’immagine dall’URL, convertila in base64, poi inserisci il risultato in inlineData.data.