Aller au contenu principal

Prompts visuels avancés : composition, éclairage, perspective

Mis à jour le 29 juillet 2026

Prompts visuels avancés : composition, éclairage, perspective

Un prompt bien structuré est ce qui sépare une image correcte d’une image de qualité professionnelle. Le levier n’est pas la longueur mais le vocabulaire : GPT Image comprend la terminologie de la photographie, du cinéma et des arts visuels, et la lui parler revient à donner des directives à un chef opérateur plutôt qu’à formuler un souhait. Cette leçon vous apprend ce vocabulaire et la manière de l’organiser.

Anatomie d’un prompt visuel professionnel

Un prompt avancé se décompose en couches, chacune répondant à une question distincte : qui ou quoi, disposé comment, éclairé comment, vu d’où, dans quel registre, avec quelles caractéristiques optiques. Les nommer explicitement dans le texte du prompt — « Sujet : … Composition : … Éclairage : … » — aide le modèle à ne pas mélanger les registres. L’exemple qui suit décrit un architecte dans son atelier : le sujet occupe le tiers gauche selon la règle des tiers, la lumière vient latéralement de grandes fenêtres, la caméra est en contre-plongée subtile avec une focale 35 mm, le registre est celui de la photographie documentaire éditoriale aux tons désaturés chauds, et la profondeur de champ laisse l’arrière-plan en bokeh léger. Chacune de ces six phrases retire au modèle une liberté qu’il aurait autrement exercée au hasard.

from openai import OpenAI
import base64

client = OpenAI()

def prompt_multicouche(
    sujet: str,
    composition: str,
    eclairage: str,
    perspective: str,
    style: str,
    details_techniques: str,
    output: str
):
    """Construit un prompt multicouche pour un contrôle maximal."""
    prompt = (
        f"Sujet : {sujet}. "
        f"Composition : {composition}. "
        f"Éclairage : {eclairage}. "
        f"Perspective : {perspective}. "
        f"Style : {style}. "
        f"Détails techniques : {details_techniques}."
    )

    response = client.images.generate(
        model="gpt-image-1",
        prompt=prompt,
        size="1536x1024",
        quality="high",
        response_format="b64_json"
    )

    data = base64.b64decode(response.data[0].b64_json)
    with open(output, "wb") as f:
        f.write(data)
    print(f"Image avancée : {output}")
    return prompt


prompt_utilise = prompt_multicouche(
    sujet="Architecte travaillant sur des plans dans un atelier lumineux",
    composition="Règle des tiers, sujet au tiers gauche, profondeur avec plans multiples",
    eclairage="Lumière naturelle latérale depuis de grandes fenêtres, ombres douces",
    perspective="Angle légèrement bas (contre-plongée subtile), focale 35mm",
    style="Photographie documentaire éditoriale, tons désaturés chauds",
    details_techniques="Profondeur de champ moyenne, premier plan net, arrière-plan en bokeh léger",
    output="architecte_atelier.png"
)

Maîtriser la composition

La composition détermine comment le regard parcourt l’image, et elle se commande par des noms de règles que le modèle reconnaît.

Règles de composition classiques

Le dictionnaire ci-dessous rassemble cinq grandes familles compositionnelles et les applique à un sujet volontairement identique — un phare isolé sur une falaise bretonne — pour que la comparaison porte uniquement sur la mise en place. La règle des tiers pose le phare à une intersection des lignes de force et produit l’image la plus « naturelle » ; la symétrie à la Wes Anderson centre l’axe vertical et ajoute un reflet dans l’eau ; la diagonale installe une tension du coin inférieur gauche vers le coin supérieur droit ; le cadre dans le cadre fait regarder le phare à travers une arche ou une fenêtre, ce qui crée une profondeur immédiate ; la composition minimaliste, enfin, réduit le phare à un point minuscule dans un vaste espace négatif et transforme le sujet en prétexte. Cinq images du même phare, cinq propos différents.

from openai import OpenAI
import base64

client = OpenAI()

compositions = {
    "regle_des_tiers": (
        "Composition règle des tiers, sujet positionné à l'intersection "
        "des lignes de force (tiers droit, tiers bas)"
    ),
    "symetrie": (
        "Composition parfaitement symétrique, axe central vertical, "
        "reflets dans l'eau, style Wes Anderson"
    ),
    "diagonale": (
        "Composition en diagonale dynamique, ligne de force du coin "
        "inférieur gauche au coin supérieur droit"
    ),
    "cadre_dans_cadre": (
        "Cadre dans le cadre : sujet vu à travers une arche, "
        "une fenêtre ou un encadrement naturel"
    ),
    "minimaliste": (
        "Composition minimaliste, énorme espace négatif, "
        "sujet petit et isolé dans un vaste environnement"
    ),
}

sujet_base = "Un phare isolé sur une falaise bretonne face à la mer"

for nom, composition in compositions.items():
    prompt = f"{sujet_base}, {composition}, photographie paysage"

    response = client.images.generate(
        model="gpt-image-1",
        prompt=prompt,
        size="1536x1024",
        quality="high",
        response_format="b64_json"
    )

    path = f"composition_{nom}.png"
    data = base64.b64decode(response.data[0].b64_json)
    with open(path, "wb") as f:
        f.write(data)
    print(f"Composition {nom}{path}")

Plans et profondeur

La profondeur ne se demande pas en bloc, elle se construit plan par plan. Le prompt suivant décrit un marché provençal en attribuant explicitement un contenu et un état de netteté à chacun des trois plans : les savons et la lavande au premier plan, parfaitement nets ; le vendeur et son client au plan moyen, en flou léger ; les façades en pierre dorée et les platanes à l’arrière-plan, en bokeh prononcé. La mention finale d’un objectif 50 mm ouvert à f/1.8 ne fait que confirmer optiquement ce que la description a déjà posé — et c’est cette redondance volontaire qui rend le résultat fiable.

from openai import OpenAI
import base64

client = OpenAI()

prompt_profondeur = (
    "Scène de marché provençal avec trois plans distincts : "
    "premier plan net — étalage de lavande et savons artisanaux, "
    "plan moyen — vendeur et client en conversation, flou léger, "
    "arrière-plan — façades en pierre dorée et platanes, bokeh prononcé. "
    "Photographie avec objectif 50mm f/1.8, profondeur de champ réduite."
)

response = client.images.generate(
    model="gpt-image-1",
    prompt=prompt_profondeur,
    size="1536x1024",
    quality="high",
    response_format="b64_json"
)

data = base64.b64decode(response.data[0].b64_json)
with open("marche_profondeur.png", "wb") as f:
    f.write(data)

Maîtriser l’éclairage

L’éclairage est l’outil le plus puissant pour créer une ambiance, et le plus rentable en nombre de caractères investis. Six schémas suffisent à couvrir l’essentiel des besoins, et la boucle ci-dessous les applique tous au même portrait de violoniste concentrée. Le Rembrandt, avec sa source unique à 45 degrés et son triangle lumineux sur la joue opposée, donne le portrait classique de studio. Le rim light place la source derrière le sujet et n’en garde que le halo de contour, ce qui produit une image de silhouette. Le split coupe le visage en deux moitiés, l’une éclairée, l’autre dans l’ombre, et bascule immédiatement vers le registre cinématographique. Le golden hour apporte la lumière dorée rasante et son lens flare nostalgique, le néon urbain ses sources rose et cyan reflétées sur des surfaces mouillées, le high key studio son uniformité sans ombre et son fond blanc commercial. Le même sujet devient tour à tour intime, mystérieux, publicitaire.

from openai import OpenAI
import base64

client = OpenAI()

eclairages_avances = {
    "rembrandt": (
        "Éclairage Rembrandt : source unique à 45 degrés, triangle lumineux "
        "sur la joue opposée, ombres profondes et dramatiques"
    ),
    "rim_light": (
        "Contre-jour (rim light) : silhouette soulignée par un halo lumineux, "
        "source directement derrière le sujet, détails dans les ombres"
    ),
    "split": (
        "Éclairage split : moitié du visage éclairée, moitié dans l'ombre, "
        "séparation nette, ambiance mystérieuse et cinématographique"
    ),
    "golden_hour": (
        "Golden hour : lumière dorée rasante, ombres allongées et chaudes, "
        "lens flare subtil, atmosphère douce et nostalgique"
    ),
    "neon": (
        "Éclairage néon urbain : sources multiples rose et cyan, "
        "reflets sur surfaces mouillées, ambiance cyberpunk nocturne"
    ),
    "studio_high_key": (
        "High key studio : éclairage uniformément lumineux, ombres minimales, "
        "fond blanc, atmosphère propre et commerciale"
    ),
}

sujet = "Portrait d'une violoniste concentrée"

for nom, eclairage in eclairages_avances.items():
    prompt = f"{sujet}, {eclairage}"

    response = client.images.generate(
        model="gpt-image-1",
        prompt=prompt,
        size="1024x1536",
        quality="high",
        response_format="b64_json"
    )

    path = f"eclairage_{nom}.png"
    data = base64.b64decode(response.data[0].b64_json)
    with open(path, "wb") as f:
        f.write(data)
    print(f"Éclairage {nom}{path}")

Maîtriser la perspective

La perspective influence la perception du sujet par le spectateur, et son effet est presque toujours psychologique avant d’être esthétique. La plongée surplombe la scène et diminue ce qu’elle regarde ; la contre-plongée, caméra au niveau du sol, grandit le sujet et lui donne de la puissance ; la vue aérienne parfaitement verticale abolit le volume et transforme le réel en motif graphique ; la worm’s eye pousse la contre-plongée à l’extrême jusqu’à faire converger toutes les lignes de fuite vers le ciel ; la vue à hauteur des yeux en focale 50 mm, enfin, reproduit le regard humain et disparaît au profit du sujet. Sur des gratte-ciels de verre et d’acier, l’écart entre ces cinq images ne tient pas au bâtiment mais au rapport qu’elles installent avec lui. Notez que la boucle bascule en format portrait pour les deux angles bas, parce qu’une contre-plongée d’immeuble a besoin de hauteur pour respirer.

from openai import OpenAI
import base64

client = OpenAI()

perspectives = {
    "plongee": (
        "Vue en plongée (angle haut), caméra surplombant la scène, "
        "effet de domination, sujet vu de dessus à 45 degrés"
    ),
    "contre_plongee": (
        "Contre-plongée (angle bas), caméra au niveau du sol regardant vers le haut, "
        "effet de grandeur et de puissance"
    ),
    "aerienne": (
        "Vue aérienne drone, parfaitement verticale (90 degrés), "
        "composition graphique, textures et motifs visibles d'en haut"
    ),
    "worm_eye": (
        "Vue worm's eye, caméra posée au sol, perspective extrême "
        "avec lignes de fuite convergeant vers le ciel"
    ),
    "eye_level": (
        "Vue à hauteur des yeux, naturelle et immersive, "
        "focale 50mm, comme le regard humain"
    ),
}

sujet = "Gratte-ciels modernes en verre et acier"

for nom, perspective in perspectives.items():
    prompt = f"{sujet}, {perspective}, photographie architecturale"

    response = client.images.generate(
        model="gpt-image-1",
        prompt=prompt,
        size="1024x1536" if nom in ["contre_plongee", "worm_eye"] else "1536x1024",
        quality="high",
        response_format="b64_json"
    )

    path = f"perspective_{nom}.png"
    data = base64.b64decode(response.data[0].b64_json)
    with open(path, "wb") as f:
        f.write(data)
    print(f"Perspective {nom}{path}")

Un constructeur de prompt réutilisable

Concaténer sept couches à la main dans chaque script vous fera tôt ou tard oublier l’une d’elles, ou en intervertir deux. La classe PromptBuilder règle le problème en exposant une méthode par couche et en retournant self à chaque appel, ce qui permet de chaîner les réglages dans un ordre lisible et de n’en spécifier que certains. La méthode build() assemble ensuite le sujet et les couches renseignées en un texte prêt à passer à client.images.generate(). L’exemple du café en bord de mer met en œuvre les sept couches disponibles — composition, éclairage, perspective, style, couleurs, atmosphère, technique — et donne un prompt qu’aucune improvisation ne produirait aussi complet.

class PromptBuilder:
    """Constructeur de prompts visuels structurés."""

    def __init__(self, sujet: str):
        self.sujet = sujet
        self.layers = {}

    def composition(self, desc: str):
        self.layers["composition"] = desc
        return self

    def eclairage(self, desc: str):
        self.layers["éclairage"] = desc
        return self

    def perspective(self, desc: str):
        self.layers["perspective"] = desc
        return self

    def style(self, desc: str):
        self.layers["style"] = desc
        return self

    def couleurs(self, desc: str):
        self.layers["palette de couleurs"] = desc
        return self

    def atmosphere(self, desc: str):
        self.layers["atmosphère"] = desc
        return self

    def technique(self, desc: str):
        self.layers["technique"] = desc
        return self

    def build(self) -> str:
        parts = [self.sujet]
        for key, value in self.layers.items():
            parts.append(f"{key} : {value}")
        return ". ".join(parts)


# Utilisation
prompt = (
    PromptBuilder("Café artisanal en bord de mer, terrasse avec parasols")
    .composition("Règle des tiers, terrasse au premier plan, mer à l'horizon")
    .eclairage("Fin d'après-midi, lumière dorée rasante, ombres allongées")
    .perspective("Légère plongée, focale 28mm grand angle")
    .style("Photographie lifestyle, tons chauds, film analogue")
    .couleurs("Terracotta, bleu méditerranée, blanc cassé, vert olive")
    .atmosphere("Détendu et méditerranéen, brise marine")
    .technique("Profondeur de champ large, tout net du premier plan à l'infini")
    .build()
)

print(prompt)
# Utilisez ce prompt avec client.images.generate()

Appropriez-vous maintenant cet outillage sur un sujet unique et exigeant : une bibliothèque ancienne. Produisez-en cinq images avec le PromptBuilder, en faisant varier systématiquement la composition, l’éclairage et la perspective, puis rassemblez-les dans un catalogue HTML. C’est en voyant les cinq côte à côte que vous saurez lesquelles de ces couches pèsent le plus dans votre pratique.