Édition multi-tour et masques
Chaîner les éditions et utiliser les masques
L’édition d’images devient vraiment puissante lorsque vous enchaînez plusieurs modifications successives ou ciblez des zones précises avec des masques. Ces deux techniques vous permettent de construire des workflows d’édition complexes et contrôlés.
L’édition multi-tour
Le principe est simple : l’URL de sortie d’une édition devient l’entrée de l’édition suivante. Chaque tour affine progressivement l’image.
import requests
import os
headers = {
"Authorization": f"Bearer {os.getenv('XAI_API_KEY')}",
"Content-Type": "application/json"
}
def edit_image(image_url, prompt):
"""Édite une image et retourne l'URL du résultat."""
response = requests.post(
"https://api.x.ai/v1/images/edits",
headers=headers,
json={
"model": "grok-imagine-image",
"prompt": prompt,
"image": {"url": image_url}
}
).json()
return response["data"][0]["url"]
# Tour 1 : modifier l'arrière-plan
url_tour1 = edit_image(
"https://exemple.com/portrait.jpg",
"Remplacez l'arrière-plan par un bureau moderne avec vue sur la ville"
)
# Tour 2 : ajuster l'éclairage
url_tour2 = edit_image(
url_tour1,
"Ajoutez un éclairage chaud et tamisé, style golden hour"
)
# Tour 3 : ajouter un élément
url_tour3 = edit_image(
url_tour2,
"Placez un ordinateur portable ouvert sur le bureau devant la personne"
)
print(f"Résultat final : {url_tour3}")
Bonnes pratiques pour le multi-tour
- Une modification par tour : évitez de demander trop de changements simultanément
- Téléchargez les résultats intermédiaires : les URL sont temporaires
- Progressez du général au spécifique : commencez par les changements majeurs
- Vérifiez chaque étape : un artefact introduit au tour 1 se propage aux suivants
Les masques
Le paramètre mask permet de définir une zone précise de l’image à modifier. Le masque est une image en noir et blanc où les zones blanches indiquent les parties à éditer et les zones noires les parties à conserver.
payload = {
"model": "grok-imagine-image",
"prompt": "Remplacez cette zone par un jardin fleuri",
"image": {
"url": "https://exemple.com/scene.jpg"
},
"mask": {
"url": "https://exemple.com/masque.png"
}
}
response = requests.post(
"https://api.x.ai/v1/images/edits",
headers=headers,
json=payload
).json()
Créer des masques programmatiquement
Vous pouvez générer des masques avec Python en utilisant la bibliothèque Pillow :
from PIL import Image, ImageDraw
# Créer un masque de mêmes dimensions que l'image source
mask = Image.new("L", (1024, 1024), 0) # Tout noir (conserver)
draw = ImageDraw.Draw(mask)
# Zone blanche = zone à éditer
# Rectangle dans le coin supérieur droit
draw.rectangle([512, 0, 1024, 512], fill=255)
mask.save("masque.png")
Masques circulaires
Pour éditer une zone circulaire (par exemple autour d’un visage) :
from PIL import Image, ImageDraw
mask = Image.new("L", (1024, 1024), 0)
draw = ImageDraw.Draw(mask)
# Cercle centré, rayon 200px
center_x, center_y = 512, 400
radius = 200
draw.ellipse(
[center_x - radius, center_y - radius,
center_x + radius, center_y + radius],
fill=255
)
mask.save("masque_circulaire.png")
Combiner multi-tour et masques
La combinaison la plus puissante consiste à utiliser des masques différents à chaque tour :
# Tour 1 : modifier l'arrière-plan (masque = tout sauf le sujet)
url_step1 = edit_with_mask(
image_url="https://exemple.com/photo.jpg",
mask_url="https://exemple.com/masque-arriere-plan.png",
prompt="Remplacez l'arrière-plan par une plage tropicale"
)
# Tour 2 : modifier un accessoire (masque ciblé)
url_step2 = edit_with_mask(
image_url=url_step1,
mask_url="https://exemple.com/masque-chapeau.png",
prompt="Remplacez par un chapeau de paille"
)
Pipeline d’édition complet
Voici un exemple de pipeline structuré :
class ImageEditor:
def __init__(self, api_key):
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
self.history = []
def edit(self, image_url, prompt, mask_url=None):
payload = {
"model": "grok-imagine-image",
"prompt": prompt,
"image": {"url": image_url}
}
if mask_url:
payload["mask"] = {"url": mask_url}
response = requests.post(
"https://api.x.ai/v1/images/edits",
headers=self.headers,
json=payload
).json()
result_url = response["data"][0]["url"]
self.history.append({
"prompt": prompt,
"input": image_url,
"output": result_url
})
return result_url
Points clés à retenir
- L’édition multi-tour chaîne les résultats d’une édition comme entrée de la suivante
- Les URL de sortie sont temporaires : téléchargez les résultats intermédiaires
- Les masques ciblent les zones à modifier (blanc = éditer, noir = conserver)
- Vous pouvez générer des masques programmatiquement avec Pillow
- Combinez multi-tour et masques pour des workflows d’édition sophistiqués