Aller au contenu principal

Marketing : visuels et bannières

Mis à jour le 29 juillet 2026

Marketing : visuels et bannières

Les équipes marketing consomment des visuels en continu : bannières publicitaires, posts réseaux sociaux, illustrations d’articles, headers d’emailing. Le goulot d’étranglement n’est presque jamais l’idée, c’est la production. GPT Image via l’API déplace ce goulot en vous permettant d’industrialiser la fabrication sans descendre en gamme, à condition d’encoder dans vos prompts ce qu’un directeur artistique saurait exiger.

Bannières publicitaires

Une bannière n’est pas une illustration : c’est un message qui doit rester lisible en petit, dans un environnement chargé, en une fraction de seconde. Le prompt doit donc porter le texte exact entre guillemets et imposer les conditions de sa lisibilité — typographie sans-serif bold, contraste élevé entre le texte et le fond, appel à l’action clair. La fonction ci-dessous fixe ces contraintes une fois pour toutes et ne laisse varier que le message et l’ambiance graphique, ici un dégradé bleu-violet avec particules lumineuses pour une offre d’essai gratuit.

from openai import OpenAI
import base64

client = OpenAI()

def banniere_pub(message: str, style: str, format_nom: str, output: str):
    """Génère une bannière publicitaire avec texte intégré."""
    prompt = (
        f"Bannière publicitaire professionnelle avec le texte \"{message}\" "
        f"en grandes lettres lisibles, {style}, "
        "design épuré et moderne, appel à l'action clair, "
        "typographie sans-serif bold, contraste élevé texte/fond"
    )

    response = client.images.generate(
        model="gpt-image-1",
        prompt=prompt,
        size="1536x1024",  # format paysage pour bannières
        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"Bannière {format_nom} : {output}")


banniere_pub(
    message="Essai gratuit 30 jours",
    style="dégradé bleu-violet, particules lumineuses, ambiance tech",
    format_nom="leaderboard",
    output="banniere_essai.png"
)

Visuels pour réseaux sociaux

Chaque plateforme a ses codes, et publier le même carré partout se voit immédiatement. Un post LinkedIn sobre en tons bleus et gris ne fonctionnerait pas sur Instagram, où l’on attend des couleurs vibrantes et une composition centrée ; une story verticale demande que le texte occupe le haut et le visuel le bas, parce que le pouce de l’utilisateur masque la partie basse de l’écran. La fonction visuel_social matérialise ces différences dans un dictionnaire de configurations qui associe à chaque plateforme sa résolution native et sa consigne stylistique, puis compose le prompt à partir du sujet et du texte que vous fournissez.

from openai import OpenAI
import base64

client = OpenAI()

def visuel_social(plateforme: str, sujet: str, texte: str, output: str):
    """Génère un visuel adapté à une plateforme sociale."""
    configs = {
        "instagram_post": {
            "size": "1024x1024",
            "style": "esthétique soignée, couleurs vibrantes, composition centrée"
        },
        "instagram_story": {
            "size": "1024x1536",
            "style": "vertical, texte en haut, visuel impactant en bas"
        },
        "linkedin": {
            "size": "1536x1024",
            "style": "professionnel et sobre, tons bleus et gris, corporate"
        },
        "twitter": {
            "size": "1536x1024",
            "style": "accrocheur, contraste fort, lisible en petit format"
        },
    }

    config = configs.get(plateforme, configs["instagram_post"])

    prompt = (
        f"Visuel pour {plateforme.replace('_', ' ')}, "
        f"sujet : {sujet}, "
        f"texte affiché : \"{texte}\", "
        f"{config['style']}, "
        "design professionnel, prêt à publier"
    )

    response = client.images.generate(
        model="gpt-image-1",
        prompt=prompt,
        size=config["size"],
        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"Visuel {plateforme} : {output}")


visuel_social("instagram_post", "lancement produit IA", "Nouveau : CorsenBot 2.0", "ig_post.png")
visuel_social("linkedin", "recrutement développeurs", "On recrute !", "linkedin_post.png")
visuel_social("instagram_story", "promotion été", "-30% ce weekend", "ig_story.png")

Illustrations d’articles de blog

L’image de couverture d’un article obéit à une règle contre-intuitive : elle ne doit contenir aucun texte. Le titre sera superposé par votre CMS, et une image qui porte déjà des lettres produit une bouillie illisible une fois le header appliqué. Le prompt le stipule donc explicitement, en plus de demander une composition panoramique et des couleurs harmonieuses. La liste d’articles qui suit montre au passage comment une même fonction sert trois registres très éloignés — l’isométrique 3D bleu pour un sujet service client, le collage coloré pour les tendances marketing, le tech sombre à néons verts pour la cybersécurité.

from openai import OpenAI
import base64

client = OpenAI()

def illustration_article(titre_article: str, style: str, output: str):
    """Génère une illustration de header pour un article de blog."""
    prompt = (
        f"Illustration conceptuelle pour un article intitulé \"{titre_article}\", "
        f"{style}, "
        "composition panoramique, pas de texte dans l'image, "
        "couleurs harmonieuses, adapté comme image de couverture de blog"
    )

    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"Illustration : {output}")


articles = [
    ("Comment l'IA transforme le service client", "style isométrique 3D, tons bleus"),
    ("5 tendances marketing 2026", "collage moderne, couleurs vives"),
    ("Guide de la cybersécurité pour PME", "style tech sombre, néons verts"),
]

for i, (titre, style) in enumerate(articles):
    illustration_article(titre, style, f"article_header_{i+1}.png")

Kit de campagne marketing

Une campagne ne se joue jamais sur un visuel unique. Il faut la bannière hero du site, le carré social, la story verticale et le header d’emailing, tous porteurs du même message et de la même palette. C’est précisément là que l’API prend l’avantage sur le travail manuel : au lieu de redécliner quatre fois un fichier source, vous décrivez une fois la campagne et vous laissez la boucle produire chaque déclinaison à sa résolution native. Le manifeste JSON écrit en fin de parcours n’est pas un ornement — c’est lui qui permettra à votre outil de publication de retrouver le bon fichier pour le bon emplacement.

from openai import OpenAI
import base64
import json

client = OpenAI()

def kit_campagne(
    nom_campagne: str,
    message_principal: str,
    palette: str,
    output_dir: str = "."
):
    """Génère un kit complet de visuels pour une campagne marketing."""
    assets = [
        {
            "nom": "hero_banner",
            "size": "1536x1024",
            "prompt_extra": "grande bannière hero, texte centré, impact maximal"
        },
        {
            "nom": "social_square",
            "size": "1024x1024",
            "prompt_extra": "post réseaux sociaux carré, composition centrée"
        },
        {
            "nom": "story_vertical",
            "size": "1024x1536",
            "prompt_extra": "format story vertical, texte en haut, visuel en bas"
        },
        {
            "nom": "email_header",
            "size": "1536x1024",
            "prompt_extra": "header email marketing, sobre et professionnel"
        },
    ]

    resultats = []

    for asset in assets:
        prompt = (
            f"Visuel marketing pour la campagne \"{nom_campagne}\", "
            f"message : \"{message_principal}\", "
            f"palette : {palette}, "
            f"{asset['prompt_extra']}, "
            "design premium, typographie moderne"
        )

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

        path = f"{output_dir}/{nom_campagne}_{asset['nom']}.png"
        data = base64.b64decode(response.data[0].b64_json)
        with open(path, "wb") as f:
            f.write(data)

        resultats.append({"asset": asset["nom"], "path": path})
        print(f"  {asset['nom']}{path}")

    # Sauvegarder le manifeste
    manifeste_path = f"{output_dir}/{nom_campagne}_manifeste.json"
    with open(manifeste_path, "w") as f:
        json.dump(resultats, f, indent=2, ensure_ascii=False)

    print(f"\nKit complet : {len(resultats)} visuels générés")
    print(f"Manifeste : {manifeste_path}")
    return resultats


kit_campagne(
    nom_campagne="rentree-2026",
    message_principal="Formez-vous à l'IA dès septembre",
    palette="bleu profond, orange cuivré, blanc"
)

Tester avant d’arbitrer

Le marketing tranche rarement au goût : il tranche aux chiffres. Encore faut-il avoir plusieurs versions à mettre en concurrence, ce qui coûtait cher tant qu’il fallait mobiliser un graphiste pour chacune. La fonction d’A/B testing génère autant de variantes que vous lui passez de configurations, en nommant les fichiers par lettre — A, B, C — pour que le rapprochement avec vos statistiques de campagne reste évident. L’exemple met en concurrence trois traitements d’une même publicité pour une application de méditation : une approche photographique nature et lumière dorée, une illustration minimaliste géométrique, un dégradé abstrait à particules. Le concept et le texte ne bougent pas ; seul le traitement visuel est testé, ce qui est la condition pour que le résultat du test veuille dire quelque chose.

from openai import OpenAI
import base64

client = OpenAI()

def ab_test_visuels(concept: str, variantes: list[dict], output_prefix: str):
    """Génère des variantes A/B d'un même concept marketing."""
    for i, variante in enumerate(variantes):
        lettre = chr(65 + i)  # A, B, C...
        prompt = (
            f"{concept}, "
            f"style : {variante['style']}, "
            f"couleur dominante : {variante['couleur']}, "
            "design professionnel, prêt à publier"
        )

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

        path = f"{output_prefix}_variante_{lettre}.png"
        data = base64.b64decode(response.data[0].b64_json)
        with open(path, "wb") as f:
            f.write(data)
        print(f"Variante {lettre} ({variante['style'][:30]}) → {path}")


ab_test_visuels(
    concept="Publicité pour une application de méditation avec le texte 'Trouvez votre calme'",
    variantes=[
        {"style": "photographique, nature et lumière dorée", "couleur": "vert et doré"},
        {"style": "illustration minimaliste, formes géométriques", "couleur": "bleu pastel"},
        {"style": "gradient abstrait, particules flottantes", "couleur": "violet et rose"},
    ],
    output_prefix="meditation_ad"
)

Les réflexes qui font la différence

Cinq habitudes séparent une production industrialisée d’une accumulation de visuels dépareillés. La cohérence de marque se joue dans le prompt : intégrez systématiquement votre palette et votre style, sinon chaque génération repart d’une esthétique par défaut et votre fil devient un patchwork. La lisibilité du texte impose une discipline de longueur — GPT Image rend bien la typographie, mais un message de cinq à sept mots reste la limite au-delà de laquelle une bannière devient un paragraphe illisible.

Générez toujours à la dimension native du support plutôt que de recadrer après coup, car le modèle compose pour le cadre qu’on lui donne et un recadrage déplace le sujet hors de sa zone de force. Archivez vos prompts au fur et à mesure : une bibliothèque de formulations éprouvées par type de visuel vaut, au bout de six mois, bien plus que n’importe quel gain de vitesse ponctuel. Enfin, faites passer chaque visuel par une validation juridique élémentaire, ne serait-ce qu’un coup d’œil, pour vérifier qu’il n’évoque pas une marque déposée existante.

Mettez tout cela bout à bout sur un lancement de produit fictif : un script qui génère la bannière hero, le post Instagram, la story, le visuel LinkedIn et deux variantes A/B du post principal, le tout accompagné d’un manifeste JSON listant chaque fichier produit.