Variationen und Iterationen
Auf dieser Seite
Aktualisiert am 2. November 2026 — Bildmodelle. Das Modell
gpt-image-1, für das dieser Kurs ursprünglich geschrieben wurde, wurde am 23. Oktober 2026 eingestellt. Zudem werdengpt-image-1.5,gpt-image-1-miniundchatgpt-image-latestam 1. Dezember 2026 zurückgezogen. Die Beispiele verwenden nungpt-image-2.5-sunburst, das die höchste Präzision für Bearbeitungen bietet;gpt-image-2.5-flareist für die Standardgenerierung schneller. Beide Modelle unterstützen zudem die Qualitätsstufenxhighundmax. GPT-Bildmodelle geben Bilder stets im Base64-Format zurück: Der Parameterresponse_formatvon älteren DALL·E-Modellen wird nicht mehr akzeptiert und aus dem Code entfernt. Quelle: Bildgenerierung (OpenAI).
Variationen und Iterationen
Das perfekte Bild beim ersten Versuch zu erhalten, ist selten. Echte Arbeit besteht darin, Variationen zu generieren, diese zu vergleichen und den Prompt schrittweise zu verfeinern, bis das gewünschte Ergebnis erreicht ist. Diese Lektion stellt Ihnen die drei Werkzeuge für diese Methode bereit: Variation durch erneutes Ausführen, Variation durch Änderung des Prompts und Iteration durch schrittweise Verfeinerung.
Generierung von Variationen desselben Konzepts
Die einfachste Methode besteht darin, die Generierung mit demselben Prompt erneut auszuführen: GPT Image erzeugt jedes Mal ein anderes Ergebnis. Dies ist am Anfang der Erkundung nützlich, wenn Sie noch nicht genau wissen, wonach Sie suchen, und den Bereich möglicher Interpretationen einer Idee sehen möchten.
from openai import OpenAI
import base64
client = OpenAI()
def generate_variations(prompt: str, n_variations: int, prefix: str):
"""Generiert mehrere unabhängige Variationen desselben Prompts."""
paths = []
for i in range(n_variations):
response = client.images.generate(
model="gpt-image-2.5-sunburst",
prompt=prompt,
size="1024x1024",
quality="medium",
)
path = f"{prefix}_v{i+1}.png"
data = base64.b64decode(response.data[0].b64_json)
with open(path, "wb") as f:
f.write(data)
paths.append(path)
print(f"Variation {i+1} gespeichert: {path}")
return paths
variationen = generate_variations(
prompt="Illustration eines Gärtners-Roboters, der Blumen gießt, kindlich und farbenfroh",
n_variations=5,
prefix="gärtner_robott"
)
Variationen durch Änderung des Prompts
Der vorherige Ansatz hinterlässt Ihnen Zufälligkeit; dieser gibt Ihnen Kontrolle. Sie fixieren ein invariantes Subjekt – hier eine dampfende Tasse Kaffee auf einem Holztisch – und verändern nur eine Dimension: die Stimmung. Die fünf Ergebnisse sind dann vergleichbar, da Sie genau wissen, was sie unterscheidet. Dies ist der Unterschied zwischen fünf Versuchen und einem Experiment.
from openai import OpenAI
import base64
client = OpenAI()
basis_prompt = "Dampfende Kaffeetasse auf einem Holztisch"
stimmungen = [
"weiches Morgenlicht, warme Töne",
"pariser Café-Vibe, Schwarz-Weiß",
"Pop-Art-Stil, gesättigte Farben",
"skandinavischer Minimalismus, weißer Hintergrund",
"gemütliche Winteratmosphäre, Bokeh-Kettenbeleuchtung",
]
for i, stimmung in enumerate(stimmungen):
prompt = f"{basis_prompt}, {stimmung}"
response = client.images.generate(
model="gpt-image-2.5-sunburst",
prompt=prompt,
size="1024x1024",
quality="medium",
)
path = f"cafe_stimmung_{i+1}.png"
data = base64.b64decode(response.data[0].b64_json)
with open(path, "wb") as f:
f.write(data)
print(f"Stimmung: {stimmung[:30]}... → {path}")
Iteration durch Verfeinerung des Prompts
Wenn das Ergebnis nicht zufriedenstellend ist, ist die richtige Reaktion nicht, erneut auszuführen und auf Glück zu hoffen, sondern die fehlende Einschränkung hinzuzufügen. Die folgende Reihe zeigt diesen Fortschritt an einem durchgearbeiteten Beispiel: “Ein Logo für einen Fintech-Startup” sagt dem Modell nichts; die zweite Iteration begrenzt die Anzahl der Farben und den Hintergrund; die dritte benennt die visuelle Metapher und die Farbpalette; die vierte geht bis zu Hex-Codes und Strichstärken. Mit jedem Durchlauf verengt sich der Raum möglicher Ergebnisse und die Reproduzierbarkeit steigt.
from openai import OpenAI
import base64
client = OpenAI()
iterationen = [
# Iteration 1: Basis-Prompt
"Ein Logo für einen Fintech-Startup",
# Iteration 2: Hinzufügen visueller Einschränkungen
"Ein Logo für einen Fintech-Startup, minimalistisches Design, maximal zwei Farben, transparenter Hintergrund",
# Iteration 3: Stilpräzision
(
"Minimalistisches Logo für einen Fintech-Startup, abstraktes geometrisches Icon, "
"das Wachstum evoziert, Farbpalette Navy-Blau und Smaragdgrün, kein Text, Vektorstil"
),
# Iteration 4: Feinjustierungen
(
"Minimalistisches Logo für einen Fintech-Startup, abstraktes geometrisches Icon: "
"zwei ineinander verschlungene Pfeile, die ein Diamant bilden, Navy-Blau (#1B2A4A) und "
"Smaragdgrün (#2ECC71), 2px dünner Strich, weißer Hintergrund, scharfe Vektorwiedergabe, zentriert"
),
]
for i, prompt in enumerate(iterationen):
response = client.images.generate(
model="gpt-image-2.5-sunburst",
prompt=prompt,
size="1024x1024",
quality="high",
)
path = f"logo_iteration_{i+1}.png"
data = base64.b64decode(response.data[0].b64_json)
with open(path, "wb") as f:
f.write(data)
print(f"Iteration {i+1}: {prompt[:60]}...")
print(f" → {path}\n")
Automatisierte Iterations-Pipeline
Bei einem etwas längeren Projekt reicht das menschliche Gedächtnis nicht aus: nach fünfzehn Bildern wissen Sie nicht mehr, welcher Prompt welches Ergebnis erzeugt hat. Die folgende Pipeline strukturiert die Arbeit in Runden, generiert pro Runde mehrere Varianten, benennt Dateien nachvollziehbar und bewahrt die vollständige Historie der Prompts in einer JSON-Datei. Diese Historien-Datei macht die Einrichtung wertvoll: Sie ermöglicht es Ihnen, zurückzugehen und Erkenntnisse aus einem Projekt für das nächste zu nutzen.
from openai import OpenAI
import base64
import json
client = OpenAI()
def iteration_pipeline(brief: str, n_rounds: int = 3, n_per_round: int = 3):
"""
Iterations-Pipeline: Generiert pro Runde mehrere Varianten,
bewahrt eine Historie der Prompts und Ergebnisse.
"""
history = []
aktueller_prompt = brief
for runden_nummer in range(1, n_rounds + 1):
print(f"\n{'='*50}")
print(f"RUNDE {runden_nummer} — Prompt: {aktueller_prompt[:80]}...")
print(f"{'='*50}")
runden_bilder = []
for i in range(n_per_round):
response = client.images.generate(
model="gpt-image-2.5-sunburst",
prompt=aktueller_prompt,
size="1024x1024",
quality="medium",
)
path = f"pipeline_r{runden_nummer}_v{i+1}.png"
data = base64.b64decode(response.data[0].b64_json)
with open(path, "wb") as f:
f.write(data)
runden_bilder.append(path)
print(f" Variante {i+1}: {path}")
history.append({
"runde": runden_nummer,
"prompt": aktueller_prompt,
"bilder": runden_bilder
})
# Prompt für die nächste Runde verfeinern
if runden_nummer < n_rounds:
aktueller_prompt += ", mehr Details, bessere Komposition"
# Historie speichern
with open("pipeline_history.json", "w") as f:
json.dump(history, f, indent=2, ensure_ascii=False)
print(f"\nHistorie gespeichert: pipeline_history.json")
return history
iteration_pipeline(
brief="Illustration eines unabhängigen Buchladens von außen gesehen, Herbstabend, Ghibli-Stil",
n_rounds=3,
n_per_round=3
)
Vergleich von Variationen in einem Katalog
Das Öffnen von neun PNGs einzeln in einem Viewer erlaubt keinen ernsthaften Vergleich. Stattdessen generieren Sie eine HTML-Seite, die sie nebeneinander anzeigt, wobei die Bilder im Base64-Format kodiert sind, sodass die Datei eigenständig ist und so an einen Kunden oder einen Kunstleiter weitergegeben werden kann.
import base64
from pathlib import Path
from glob import glob
def generate_catalog(images: list[str], title: str, output: str = "catalog.html"):
"""Erstellt eine HTML-Seite mit allen Bildern nebeneinander."""
html_parts = [
'<!DOCTYPE html><html><head><meta charset="utf-8">',
f'<title>{title}</title>',
'<style>',
'body { background: #111; color: #fff; font-family: sans-serif; padding: 2rem; }',
'.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 1rem; }',
'.card { background: #222; border-radius: 8px; overflow: hidden; }',
'.card img { width: 100%; display: block; }',
'.card p { padding: 0.5rem 1rem; font-size: 0.85rem; color: #aaa; }',
'</style></head><body>',
f'<h1>{title}</h1><div class="grid">',
]
for img_path in images:
with open(img_path, "rb") as f:
b64 = base64.b64encode(f.read()).decode()
html_parts.append(f'<div class="card">')
html_parts.append(f'<img src="data:image/png;base64,{b64}" />')
html_parts.append(f'<p>{Path(img_path).name}</p></div>')
html_parts.append('</div></body></html>')
with open(output, "w") as f:
f.write("\n".join(html_parts))
print(f"Katalog generiert: {output}")
bilder = sorted(glob("pipeline_r*_v*.png"))
generate_catalog(bilder, "Variationen — Ghibli Buchladen")
Die Disziplin der Iteration
Einige Prinzipien trennen produktive Iteration von kostspieligem Versuch und Irrtum. Ändern Sie nur einen Parameter auf einmal, sonst werden Sie nie wissen, welcher das Ergebnis verbessert hat. Bewahren Sie eine Historie Ihrer Prompts und Renderings auf, wie die obige Pipeline es tut, um Erkenntnisse zu nutzen, statt bei jedem Projekt von vorne zu beginnen. Arbeiten Sie während der gesamten Erkundungsphase mit quality: low und wechseln Sie erst auf high für das finale Rendering, oder Sie zahlen den vollen Preis für Bilder, die Sie wegwerfen werden. Wenn Sie einfach nach schneller Vielfalt suchen, bevorzugen Sie einen einzelnen Aufruf mit dem n-Parameter gegenüber einer Schleife von Anfragen. Benennen Sie Ihre Dateien schließlich deskriptiv: Es ist ein trivialer Detailpunkt am ersten Tag, aber entscheidend nach zweihundert Bildern.
Wenden Sie nun diese vollständige Sequenz auf ein Thema Ihrer Wahl an – Logo, Illustration oder Produktfotografie. Generieren Sie drei Varianten mit einem initialen Prompt, verfeinern Sie diesen Prompt im Lichte der Ergebnisse, generieren Sie drei neue Varianten und erstellen Sie dann den vergleichenden HTML-Katalog der sechs Bilder.