Bewerking von bestehenden Bildern (Inpainting, Outpainting)
Auf dieser Seite
Aktualisiert am 2. November 2026 — Bildmodelle. Das Modell
gpt-image-1, für das dieser Kurs ursprünglich verfasst 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 allgemeine Generierung schneller. Beide Modelle unterstützen zudem die Qualitätsstufenxhighundmax. GPT-Bildmodelle geben Bilder stets im Base64-Format zurück: Der Parameterresponse_format, der von älteren DALL·E-Modellen verwendet wurde, wird nicht mehr akzeptiert und aus dem Code entfernt. Quelle: Bildgenerierung (OpenAI).
Bewerking von bestehenden Bildern
Die Methode client.images.edit() modifiziert ein bestehendes Bild unter Verwendung einer Maske, die den Bereich definiert, der neu generiert werden soll. Dies führt zu zwei unterschiedlichen Anwendungsfällen, die präzise benannt werden sollten, da sie unterschiedliche Masken erfordern. Inpainting füllt oder ersetzt einen Innenbereich – Sie könnten beispielsweise den Himmel in einer Landschaft, den Bildschirm auf einem Computer oder die Farbe einer Wand ändern. Outpainting erweitert hingegen das Bild über seine ursprünglichen Ränder hinaus, zum Beispiel indem ein quadratisches Porträt in ein panoramisches Banner verwandelt wird.
Funktionsweise der Maske
Die Maske ist ein PNG-Bild mit denselben Abmessungen wie das Quelldbild. Transparente Bereiche (Alpha = 0) geben an, wo das Modell neuen Inhalt generieren soll; undurchsichtige Bereiche bleiben unberührt. Diese Konvention ist zunächst kontraintuitiv: Man möchte intuitiv „malen”, was man ändern möchte, muss aber stattdessen in der Maske ein Loch ausschneiden. Der API-Aufruf selbst bleibt einfach und erfordert lediglich die beiden Dateien sowie eine Beschreibung dessen, was erscheinen soll.
import base64
from openai import OpenAI
client = OpenAI()
response = client.images.edit(
model="gpt-image-2.5-sunburst",
image=open("desk_photo.png", "rb"),
mask=open("desk_mask.png", "rb"),
prompt="Ein Computerbildschirm, der ein modernes Analytik-Dashboard anzeigt"
)
with open("edited_desk.png", "wb") as f:
f.write(base64.b64decode(response.data[0].b64_json))
Sie benötigen keinen Grafikeditor, um diese Maske zu erstellen. Pillow kann diese in nur wenigen Zeilen generieren: Beginnen Sie mit einer vollständig undurchsichtigen Schicht, die den Quelldimensionen entspricht, und zeichnen Sie dann die Form, die Sie transparent machen möchten. Der folgende Skript erstellt ein rechteckiges Fenster in der Mitte des Bildes.
from PIL import Image, ImageDraw
# Lade das Quelldbild, um seine Abmessungen zu erhalten
source = Image.open("desk_photo.png")
width, height = source.size
# Erstelle eine vollständig undurchsichtige Maske (schwarz)
mask = Image.new("RGBA", (width, height), (0, 0, 0, 255))
draw = ImageDraw.Draw(mask)
# Zeichne einen transparenten Bereich (der Bereich zur Bearbeitung)
# Rechteck in der Mitte des Bildes
x1, y1 = width // 4, height // 4
x2, y2 = 3 * width // 4, 3 * height // 4
draw.rectangle([x1, y1, x2, y2], fill=(0, 0, 0, 0))
mask.save("desk_mask.png")
print(f"Maske erstellt: {width}x{height}, bearbeitbarer Bereich in der Mitte")
Inpainting: Ersetzen eines Elements
Sobald Sie diese Operation wiederholen, macht es Sinn, die Masken-Erstellung und den API-Aufruf in eine einzelne Funktion zu kapseln, die durch den zu modifizierenden Bereich parametrisiert ist. Der Prompt sollte dann nur den Inhalt beschreiben, der innerhalb des maskierten Bereichs erwartet wird, niemals den Rest des Bildes. Das folgende Beispiel wendet diese Funktion auf ein Landschaftsfoto an und modifiziert nur die oberen 400 Pixel – den Himmel –, um ihm eine stürmische Atmosphäre zu verleihen.
from openai import OpenAI
from PIL import Image, ImageDraw
import base64
client = OpenAI()
def inpaint_region(image_path, region, prompt, output_path):
"""
Ersetze einen rechteckigen Bereich in einem Bild.
region: Tupel (x1, y1, x2, y2) in Pixeln
"""
# Erstelle die Maske
source = Image.open(image_path)
mask = Image.new("RGBA", source.size, (0, 0, 0, 255))
draw = ImageDraw.Draw(mask)
draw.rectangle(region, fill=(0, 0, 0, 0))
mask.save("temp_mask.png")
# Rufe die API auf
response = client.images.edit(
model="gpt-image-2.5-sunburst",
image=open(image_path, "rb"),
mask=open("temp_mask.png", "rb"),
prompt=prompt
)
# Speichere das Ergebnis
with open(output_path, "wb") as f:
f.write(base64.b64decode(response.data[0].b64_json))
print(f"Bearbeitetes Bild gespeichert: {output_path}")
# Beispiel: Ersetze den Himmel in einem Landschaftsfoto
inpaint_region(
image_path="landscape.png",
region=(0, 0, 1024, 400), # Oberer Teil = der Himmel
prompt="Dramatischer Himmel mit lila Sturmwolken bei Sonnenuntergang",
output_path="landscape_sky_edited.png"
)
Outpainting: Erweitern des Bildes
Das Vergrößern eines Bildes erfordert einen zusätzlichen Schritt, da die API keinen Inhalt direkt „neben” einer Datei generieren kann. Sie müssen zunächst einen größeren Leinwand erstellen, das Original darauf einfügen und eine Maske bereitstellen, die genau den Bereich schützt, den das Original einnimmt. Die gesamte Logik hängt von der Berechnung der neuen Abmessungen und der Einfügemarke basierend auf der angeforderten Richtung ab.
from openai import OpenAI
from PIL import Image
import base64
from io import BytesIO
client = OpenAI()
def outpaint(image_path, direction, extra_pixels, prompt, output_path):
"""
Erweitere ein Bild in einer gegebenen Richtung.
direction: 'right', 'bottom', 'left', 'top'
extra_pixels: Anzahl der hinzuzufügenden Pixel
"""
source = Image.open(image_path).convert("RGBA")
w, h = source.size
# Berechne neue Abmessungen
if direction == "right":
new_size = (w + extra_pixels, h)
paste_pos = (0, 0)
elif direction == "bottom":
new_size = (w, h + extra_pixels)
paste_pos = (0, 0)
elif direction == "left":
new_size = (w + extra_pixels, h)
paste_pos = (extra_pixels, 0)
elif direction == "top":
new_size = (w, h + extra_pixels)
paste_pos = (0, extra_pixels)
# Erstelle die erweiterte Leinwand (transparent = Bereich zur Generierung)
extended = Image.new("RGBA", new_size, (0, 0, 0, 0))
extended.paste(source, paste_pos)
# Die Maske: transparent überall außer dort, wo das Originalbild platziert ist
mask = Image.new("RGBA", new_size, (0, 0, 0, 0))
opaque = Image.new("RGBA", (w, h), (0, 0, 0, 255))
mask.paste(opaque, paste_pos)
# Speichere vorübergehend
extended.save("temp_extended.png")
mask.save("temp_mask_outpaint.png")
response = client.images.edit(
model="gpt-image-2.5-sunburst",
image=open("temp_extended.png", "rb"),
mask=open("temp_mask_outpaint.png", "rb"),
prompt=prompt
)
with open(output_path, "wb") as f:
f.write(base64.b64decode(response.data[0].b64_json))
print(f"Erweitertes Bild gespeichert: {output_path}")
# Erweitere ein Porträt nach rechts
outpaint(
image_path="portrait.png",
direction="right",
extra_pixels=512,
prompt="Natürliche Fortsetzung der Szene, gleiches Licht und Hintergrund",
output_path="portrait_extended.png"
)
Achten Sie auf die Formulierung des Erweiterungs-Prompts: „Natürliche Fortsetzung der Szene, gleiches Licht und Hintergrund.” Beim Outpainting beschreiben Sie kein neues Motiv, sondern bitten das Modell, das zu sehen, zu erweitern. Ein zu kreativer Prompt würde eine sichtbare Naht zwischen dem Original und dem hinzugefügten Bereich erzeugen.
Iterative Bearbeitung
Es hindert nichts daran, mehrere Bearbeitungen hintereinander auf demselben Bild durchzuführen und jedes Ausgabeergebnis als Eingabe für den nächsten Schritt zu verwenden. Dies ist der zuverlässigste Weg, um eine komplexe Komposition zu erstellen: Behandeln Sie zuerst den Hintergrund, dann den Vordergrund, mit einer dedizierten Maske für jeden Durchlauf, anstatt zu hoffen, dass ein einzelner Prompt alles auf einmal korrigiert.
import base64
from openai import OpenAI
client = OpenAI()
def edit_step(image_path, mask_path, prompt, output_path):
response = client.images.edit(
model="gpt-image-2.5-sunburst",
image=open(image_path, "rb"),
mask=open(mask_path, "rb"),
prompt=prompt
)
with open(output_path, "wb") as f:
f.write(base64.b64decode(response.data[0].b64_json))
return output_path
# Schritt 1: Modifiziere den Hintergrund
step1 = edit_step(
"scene.png", "mask_background.png",
"Lush tropischer Waldhintergrund",
"scene_step1.png"
)
# Schritt 2: Füge ein Element in den Vordergrund hinzu
step2 = edit_step(
step1, "mask_foreground.png",
"Ein bunter Papagei, der auf einem Ast sitzt",
"scene_step2.png"
)
print(f"Endergebnis: {step2}")
Wichtige Einschränkungen
Vier technische Regeln bestimmen den Erfolg des Aufrufs. Die Verletzung einer davon führt zu einem sofortigen Fehler statt zu einem verschlechterten Ergebnis.
- Das Quelldbild und die Maske müssen die gleichen Abmessungen aufweisen
- Beide Dateien müssen im PNG-Format vorliegen
- Die maximale Größe pro Datei beträgt 4 MB
- Die Maske verwendet den Alphakanal, um bearbeitbare Bereiche zu definieren
Eine empirische Beobachtung fügt diesen Einschränkungen hinzu: Die Ergebnisse sind konsistenter, wenn der maskierte Bereich weniger als 50 % des Bildes ausmacht. Darüber hinaus hat das Modell zu wenig Kontext, um korrekt zu mischen, und Sie werden oft bessere Ergebnisse erzielen, indem Sie Ihre Modifikation in zwei aufeinanderfolgende Bearbeitungen aufteilen.
Setzen Sie dies in die Praxis um mit einem Foto Ihres Schreibtisches oder einem beliebigen lizenzfreien Bild: Schreiben Sie ein Skript, das automatisch eine Maske über das obere Viertel des Bildes generiert, diesen Bereich durch einen sternenhellen Himmel ersetzt und das Ergebnis lokal speichert.