Créer des images depuis un prompt
Sur cette page
Mise à jour du 2 novembre 2026 — modèles d’image.
gpt-image-1, sur lequel ce cours avait été écrit, est arrêté depuis le 23 octobre 2026, etgpt-image-1.5,gpt-image-1-minietchatgpt-image-latestseront retirés le 1er décembre 2026. Les exemples utilisent désormaisgpt-image-2.5-sunburst, le plus précis en édition ;gpt-image-2.5-flareest plus rapide pour la génération courante. Les deux acceptent en plus les qualitésxhighetmax. Les modèles GPT Image renvoient toujours l’image en base64 : le paramètreresponse_formatdes anciens modèles DALL·E n’est pas accepté et a été retiré du code. Source : Image generation (OpenAI).
Créer des images depuis un prompt
La méthode client.images.generate() est le point d’entrée principal pour créer une image à partir d’une description textuelle. Elle tient en une poignée de paramètres, mais c’est précisément parce qu’ils sont peu nombreux que chacun compte : la différence entre un résultat aléatoire et un résultat prévisible se joue presque entièrement dans le contenu du champ prompt. Cette leçon vous apprend à maîtriser les deux.
Anatomie d’un appel de génération
Voici la structure complète d’un appel avec tous les paramètres disponibles.
from openai import OpenAI
client = OpenAI()
response = client.images.generate(
model="gpt-image-2.5-sunburst",
prompt="Description détaillée de l'image souhaitée",
n=1,
size="1024x1024",
quality="high"
)
| Paramètre | Type | Description |
|---|---|---|
model | string | "gpt-image-2.5-sunburst" (le plus précis) ou "gpt-image-2.5-flare" (le plus rapide) |
prompt | string | Description de l’image (jusqu’à 32 000 caractères) |
n | integer | Nombre d’images à générer (1 à 10) |
size | string | "1024x1024", "1024x1536", "1536x1024" |
quality | string | "low", "medium", "high" |
La limite de 32 000 caractères pour le prompt est confortable : elle vous autorise des descriptions très détaillées, et vous verrez plus loin que le détail est votre meilleur levier de contrôle.
Récupérer l’image générée
La réponse contient un objet data qui porte les images. Les modèles GPT Image renvoient toujours l’image encodée en base64, dans le champ b64_json : vous la décodez et l’écrivez sur disque dans la foulée. Le paramètre response_format et les URL temporaires des anciens modèles DALL·E ne s’appliquent pas à GPT Image.
import base64
response = client.images.generate(
model="gpt-image-2.5-sunburst",
prompt="Un jardin japonais sous la pluie, photographie",
n=1,
size="1024x1024",
)
image_data = base64.b64decode(response.data[0].b64_json)
with open("jardin.png", "wb") as f:
f.write(image_data)
print("Image sauvegardée : jardin.png")
Une fois le fichier écrit, plus rien ne dépend d’OpenAI : c’est ce fichier que vous stockez, servez ou retravaillez.
Générer plusieurs images en un seul appel
Le paramètre n demande plusieurs variantes en une requête. C’est le réflexe à prendre lorsque vous cherchez une direction visuelle sans savoir laquelle retenir : quatre propositions côte à côte vous renseignent bien mieux qu’une seule.
import base64
response = client.images.generate(
model="gpt-image-2.5-sunburst",
prompt="Logo minimaliste pour une boulangerie artisanale, fond blanc",
n=4,
size="1024x1024",
quality="high"
)
for i, image in enumerate(response.data):
with open(f"logo_{i+1}.png", "wb") as f:
f.write(base64.b64decode(image.b64_json))
print(f"Variante {i+1} : logo_{i+1}.png")
Attention toutefois à la facture : chaque image consomme des tokens indépendamment, et générer 4 images coûte 4 fois le prix d’une seule. Explorez en n élevé avec une qualité basse, réservez la qualité haute au tirage définitif.
Écrire des prompts efficaces
La qualité du résultat dépend directement de la précision de votre prompt. Un bon prompt suit une structure simple — sujet + style + contexte + détails techniques — et la comparaison ci-dessous rend la différence tangible : « une maison » laisse le modèle inventer tout ce que vous n’avez pas dit, tandis que la version développée fixe le matériau, la couleur des volets, l’heure de la prise de vue, le registre éditorial et le traitement optique.
# Prompt vague — résultat imprévisible
prompt_faible = "une maison"
# Prompt structuré — résultat contrôlé
prompt_fort = (
"Maison de campagne provençale en pierre blonde, "
"volets bleu lavande, vigne vierge sur la façade, "
"photographiée à l'heure dorée, "
"style éditorial pour magazine d'architecture, "
"composition centrée, profondeur de champ"
)
response = client.images.generate(
model="gpt-image-2.5-sunburst",
prompt=prompt_fort,
size="1536x1024",
quality="high"
)
Le style visuel se déclare de la même manière, en nommant un médium plutôt qu’en espérant une intention. GPT Image comprend une grande variété de registres, et la boucle suivante vous fait sentir l’écart entre eux sur un sujet strictement identique : le vélo devant le café parisien change complètement de nature selon qu’on demande une photographie éditoriale, un aplat vectoriel ou un croquis au crayon.
import base64
styles = [
"photographie éditoriale, éclairage studio",
"illustration vectorielle flat design",
"aquarelle sur papier texturé",
"rendu 3D photoréaliste, Octane Render",
"croquis au crayon sur papier kraft",
]
for style in styles:
prompt = f"Un vélo vintage garé devant un café parisien, {style}"
response = client.images.generate(
model="gpt-image-2.5-sunburst",
prompt=prompt,
size="1024x1024",
quality="medium"
)
fichier = f"velo_{styles.index(style) + 1}.png"
with open(fichier, "wb") as f:
f.write(base64.b64decode(response.data[0].b64_json))
print(f"Style : {style} → {fichier}")
Le texte intégré à l’image mérite un mot à part, car c’est là que GPT Image se distingue nettement de ses prédécesseurs. Donnez le message entre guillemets dans le prompt, précisez la famille typographique et le traitement graphique attendu, et le rendu est lisible.
response = client.images.generate(
model="gpt-image-2.5-sunburst",
prompt=(
"Affiche promotionnelle avec le texte \"SOLDES D'ÉTÉ -50%\" "
"en grandes lettres blanches sur fond dégradé bleu-orange, "
"typographie moderne sans-serif, style commercial professionnel"
),
size="1024x1536",
quality="high"
)
Gestion des erreurs
Un script de génération qui tourne en boucle finit toujours par rencontrer une limite de débit ou une erreur d’API. Traitez les deux cas distinctement dès le premier jet : RateLimitError appelle une attente et une nouvelle tentative, alors qu’une APIError demande d’examiner le message avant de relancer quoi que ce soit.
import base64
from openai import OpenAI, APIError, RateLimitError
client = OpenAI()
try:
response = client.images.generate(
model="gpt-image-2.5-sunburst",
prompt="Un paysage de montagne enneigée au lever du jour",
size="1024x1024"
)
with open("montagne.png", "wb") as f:
f.write(base64.b64decode(response.data[0].b64_json))
except RateLimitError:
print("Limite de requêtes atteinte. Attendez avant de réessayer.")
except APIError as e:
print(f"Erreur API : {e.message}")
Pour ancrer tout cela, écrivez maintenant un script qui génère trois variantes d’un même sujet dans trois styles différents — photo, illustration, aquarelle — et sauvegarde chaque image en local au format PNG, en passant par le format base64 pour la récupération.