Overzicht van de Imagen API
Imagen is het tekst-naar-beeldmodel van Google. Je benadert het programmatisch op twee manieren:
- Vertex AI (aanbevolen voor productie): authenticatie via Google Cloud-credentials, hogere quota, edit- en upscale-functies. In dit artikel de hoofdroute.
- Gemini API (voor lagere volumes en snelle proefjes): authenticatie met een API-key.
Sinds 2025 verloopt beide routes via dezelfde bibliotheek: de Google Gen AI SDK (google-genai, importnaam google.genai). Je kiest met een vlag of je tegen Vertex AI of de Gemini API praat. Eén codebasis, twee backends.
De oude SDK is uitgefaseerd
De oudere modules vertexai.vision_models en vertexai.preview.vision_models (met ImageGenerationModel.from_pretrained(...) en modelnamen als imagegeneration@006) zijn vervangen door de Google Gen AI SDK en stoppen rond 24 juni 2026. Nieuwe code schrijf je met from google import genai. Bestaande code migreer je. Controleer de actuele situatie in de migratiegids van Vertex AI.
Welk model kies je
In juni 2026 is Imagen 4 de nieuwste generatie op Vertex AI. Veelgebruikte modelnamen:
| Modelnaam | Wanneer |
|---|---|
imagen-4.0-generate-001 |
Nieuwste, hoogste kwaliteit |
imagen-3.0-generate-002 |
Stabiele vorige generatie |
imagen-3.0-capability-001 |
Voor edit- en inpainting-taken |
Modelnamen en beschikbaarheid per regio veranderen regelmatig. Bevestig de naam die in jouw regio actief is in de Vertex AI-modeldocumentatie voor je hardcodeert.
Vereisten
Installatie
pip install google-genai pillow
Gebruik een vaste versie (pin) in je requirements.txt, bijvoorbeeld google-genai==1.* met een exacte patchversie, zodat builds reproduceerbaar blijven.
Authenticatie
Voor lokaal ontwikkelen met je eigen Google-account:
gcloud auth application-default login
export GOOGLE_CLOUD_PROJECT="jouw-project-id"
In productie gebruik je een service account. Op Cloud Run, Cloud Functions of een VM met de juiste IAM-rol (roles/aiplatform.user) hoef je geen sleutelbestand mee te geven; de omgeving levert de credentials automatisch. Een sleutelbestand op schijf is een veiligheidsrisico en alleen nodig buiten Google Cloud:
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/pad/naar/credentials.json"
Houd sleutels uit je repository
Commit nooit een service-account-sleutel of API-key. Zet ze in een secret manager of in omgevingsvariabelen, en voeg *.json-sleutels toe aan je .gitignore.
Basisgebruik
from google import genai
from google.genai import types
client = genai.Client(
vertexai=True,
project="jouw-project-id",
location="us-central1",
)
response = client.models.generate_images(
model="imagen-4.0-generate-001",
prompt="Een professionele workspacefoto van mensen die samenwerken op laptops, daglicht, fotorealistisch",
config=types.GenerateImagesConfig(
number_of_images=1,
aspect_ratio="16:9",
person_generation="allow_adult",
),
)
response.generated_images[0].image.save("output.png")
print("Afbeelding opgeslagen als output.png")
De image-objecten in response.generated_images hebben een save(pad)-methode en een attribuut image_bytes met de ruwe bytes, handig als je niet naar schijf wilt schrijven.
Veelgebruikte parameters
Je geeft parameters mee via types.GenerateImagesConfig(...):
| Parameter | Type | Beschrijving |
|---|---|---|
number_of_images |
int | Aantal varianten, 1 tot 4 |
aspect_ratio |
str | "1:1", "3:4", "4:3", "9:16" of "16:9" |
image_size |
str | "1K" of "2K" (resolutie, modelafhankelijk) |
person_generation |
str | "dont_allow", "allow_adult" of "allow_all" |
negative_prompt |
str | Wat er niet in de afbeelding mag |
seed |
int | Vaste zaadwaarde voor reproduceerbare resultaten |
output_mime_type |
str | "image/png" of "image/jpeg" |
Het genereren van afbeeldingen van kinderen is niet toegestaan, ook niet met allow_all. Welke parameters een model precies ondersteunt verschilt per modelversie; controleer de parameterdocumentatie bij twijfel.
Negatieve prompts
Met een negatieve prompt stuur je bij wat je juist wilt vermijden:
response = client.models.generate_images(
model="imagen-4.0-generate-001",
prompt="Professionele kantooromgeving met moderne meubels",
config=types.GenerateImagesConfig(
number_of_images=2,
aspect_ratio="16:9",
negative_prompt="rommel, slechte belichting, mensen, tekst, logo's",
),
)
Afbeelding verwerken met Pillow
Wil je de afbeelding nabewerken (formaat aanpassen, comprimeren naar WebP) zonder eerst naar schijf te schrijven, gebruik dan de ruwe bytes:
from PIL import Image
from io import BytesIO
for i, generated in enumerate(response.generated_images):
pil_image = Image.open(BytesIO(generated.image.image_bytes)).convert("RGB")
pil_image.thumbnail((1280, 720))
pil_image.save(f"output_{i}.webp", "WEBP", quality=85)
Een afbeelding bewerken (inpainting)
Voor inpainting of het vervangen van een gebied gebruik je edit_image met referentiebeelden. Dit draait op het capability-model en is alleen op Vertex AI beschikbaar:
from google.genai import types
raw_ref = types.RawReferenceImage(
reference_image=types.Image.from_file(location="referentie.jpg"),
reference_id=0,
)
response = client.models.edit_image(
model="imagen-3.0-capability-001",
prompt="Vervang de achtergrond door een moderne kantooromgeving",
reference_images=[raw_ref],
config=types.EditImageConfig(
edit_mode="EDIT_MODE_INPAINT_INSERTION",
number_of_images=1,
),
)
response.generated_images[0].image.save("bewerkt.png")
Edit-modi verschillen per model
Welke edit_mode-waarden (zoals EDIT_MODE_INPAINT_INSERTION of EDIT_MODE_OUTPAINT) en welke referentietypes beschikbaar zijn, hangt af van het model en de versie. Raadpleeg de actuele documentatie voor de geldige combinaties.
Foutafhandeling
Vang quota- en validatiefouten apart af, zodat je gericht kunt reageren:
import time
from google.genai import errors
try:
response = client.models.generate_images(
model="imagen-4.0-generate-001",
prompt=prompt,
config=types.GenerateImagesConfig(number_of_images=1),
)
except errors.ClientError as e:
if e.code == 429:
print(f"Quota overschreden, wacht en probeer opnieuw: {e}")
time.sleep(60)
else:
print(f"Ongeldige aanvraag of geblokkeerde prompt: {e}")
except errors.ServerError as e:
print(f"Serverfout aan Google-kant: {e}")
raise
De SDK groepeert fouten in ClientError (4xx, zoals een geweigerde prompt of overschreden quota) en ServerError (5xx). Het HTTP-statusnummer staat in e.code.
Flask-endpoint als voorbeeld
Een eenvoudige REST-endpoint die Imagen aanroept en een WebP teruggeeft:
from flask import Flask, request, jsonify, send_file
from io import BytesIO
from google import genai
from google.genai import types
app = Flask(__name__)
client = genai.Client(vertexai=True, project="jouw-project-id", location="us-central1")
@app.route("/genereer", methods=["POST"])
def genereer():
data = request.get_json(silent=True) or {}
prompt = data.get("prompt", "").strip()
if not prompt or len(prompt) > 2000:
return jsonify({"fout": "Ongeldige prompt"}), 400
response = client.models.generate_images(
model="imagen-4.0-generate-001",
prompt=prompt,
config=types.GenerateImagesConfig(number_of_images=1, aspect_ratio="16:9"),
)
buffer = BytesIO(response.generated_images[0].image.image_bytes)
buffer.seek(0)
return send_file(buffer, mimetype="image/png")
if __name__ == "__main__":
app.run(debug=False)
Bescherm een publieke generatie-endpoint
Beeldgeneratie kost geld per afbeelding. Zet zo'n endpoint nooit onbeveiligd online: voeg authenticatie, een rate limit en een maximumlengte op de prompt toe, en valideer de invoer. Anders kan iemand jouw quota en factuur opstoken.
Verder kijken: Gemini-beeldmodellen
Naast Imagen biedt Google ook beeldgeneratie via de Gemini-modellen (informeel "Nano Banana" genoemd). Die zijn sterk in conversationeel bewerken en het combineren van tekst en beeld in één gesprek. Voor strakke, hoogwaardige tekst-naar-beeld blijft Imagen 4 doorgaans de eerste keuze. Weeg per use case af wat past, en houd de releasenotes in de gaten, want dit veld beweegt snel.
Welke Imagen-modelversie moet ik gebruiken?
In juni 2026 is imagen-4.0-generate-001 de nieuwste generatie en doorgaans de beste keuze. Wil je stabiliteit boven nieuwste features, dan is imagen-3.0-generate-002 een degelijk alternatief. Controleer welke modellen in jouw regio beschikbaar zijn voor je een naam hardcodeert.
Moet ik de oude vertexai-vision_models-code herschrijven?
Ja. Die modules zijn uitgefaseerd en stoppen rond 24 juni 2026. Vervang ImageGenerationModel.from_pretrained(...) door een genai.Client(vertexai=True, ...) en client.models.generate_images(...). De parameters zijn grotendeels vergelijkbaar, maar zitten nu in een GenerateImagesConfig-object.
Hoe hoog zijn de kosten per afbeelding?
Vertex AI rekent per gegenereerde afbeelding, met een tarief dat afhangt van model en resolutie. Bekijk de actuele bedragen in de Google Cloud-prijslijst voor Vertex AI, want prijzen wijzigen los van deze handleiding.
Kan ik dit draaien vanuit Cloud Run of Cloud Functions?
Ja. De Google Gen AI SDK werkt prima serverless. Geef het draaiende account de rol roles/aiplatform.user, dan hoef je geen apart sleutelbestand mee te leveren; de omgeving levert de credentials.
Wat doe ik bij een rate limit of quota-fout?
Een quota-overschrijding komt terug als een ClientError met code 429. Bouw een retry met wachttijd (backoff) in, en vraag indien nodig een hoger quotum aan via de Google Cloud Console.
Werkt dezelfde code ook tegen de Gemini API in plaats van Vertex AI?
Grotendeels wel. Maak de client dan zonder vertexai=True en geef een API-key mee in plaats van project en locatie. De Gemini-route heeft minder configuratieopties en lagere quota, en is bedoeld voor kleinere volumes of prototypes.