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.partsinline_data.

Codice di esempio

Python usa snake_case; REST/cURL usa camelCase. Stesso significato.

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 
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)
contentsSolo testo (descrivi l’immagine da creare)Immagine + testo (descrivi come modificare)
generationConfig.imageConfigObbligatorio (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.