Générer et modifier des images avec Gemini

Les modèles Gemini suivants sont compatibles avec la génération d'images en plus du texte :

  • Gemini 2.5 Flash Image, également appelé Gemini 2.5 Flash (avec Nano Banana)

  • Gemini 3 Pro Image (preview), également appelé Gemini 3 Pro (avec Nano Banana)

Les capacités de Gemini sont ainsi étendues pour inclure les éléments suivants :

  • Générez des images de manière itérative en conversant en langage naturel, et ajustez-les tout en conservant la cohérence et le contexte.
  • Générez des images avec un rendu de texte long de haute qualité.
  • Générez du texte et des images entrelacés. Par exemple, un article de blog avec du texte et des images en un seul tour. Auparavant, cela nécessitait d'enchaîner plusieurs modèles.
  • Générez des images à l'aide des connaissances du monde et des capacités de raisonnement de Gemini.

Gemini 2.5 Flash Image (gemini-2.5-flash-image) et Gemini 3 Pro Image Preview (gemini-3-pro-image-preview) permettent de générer des images de personnes et contiennent des filtres de sécurité mis à jour qui offrent une expérience utilisateur plus flexible et moins restrictive. Gemini 2.5 Flash Image peut générer des images en 1 024 px. Gemini 3 Pro Image peut générer des images jusqu'à 4 096 px.

Les deux modèles sont compatibles avec les modalités et les fonctionnalités suivantes :

  • Texte vers image

    • Exemple de requête : "Génère une image de la tour Eiffel avec des feux d'artifice en arrière-plan."
  • Texte vers image (rendu de texte)

    • Exemple de requête : "génère une photo cinématographique d'un grand bâtiment avec cette projection de texte géant sur la façade : "Gemini 3 peut désormais générer du texte long""
  • Texte en image(s) et texte (entrelacé)

    • Exemple de requête : "Génère une recette illustrée de paella. Crée des images à côté du texte lorsque tu génères la recette."
    • Exemple de requête : "Génère une histoire sur un chien dans un style d'animation cartoon 3D. Pour chaque scène, génère une image"
  • Image(s) et texte vers image(s) et texte (entrelacés)

    • Exemple de requête : (Avec une image d'une pièce meublée) "Quelles autres couleurs de canapés conviendraient à mon espace ? Peux-tu mettre à jour l'image ?"

Bonnes pratiques

Pour améliorer les résultats de la génération d'images, suivez ces bonnes pratiques :

  • Soyez précis : plus vous fournissez d'informations, plus vous avez de contrôle. Par exemple, au lieu de "armure fantastique", essayez "armure de plates elfique ornée, gravée de motifs en feuille d'argent, avec un col montant et des épaulières en forme d'ailes de faucon".

  • Fournissez le contexte et l'intention : expliquez l'objectif de l'image pour aider le modèle à comprendre le contexte. Par exemple, "Crée un logo pour une marque de soins pour la peau haut de gamme et minimaliste" fonctionne mieux que "Crée un logo".

  • Répétez et affinez : ne vous attendez pas à obtenir une image parfaite du premier coup. Utilisez des requêtes de suivi pour apporter de petites modifications, par exemple "Rends l'éclairage plus chaud" ou "Rends l'expression du personnage plus sérieuse".

  • Utilisez des instructions détaillées : pour les scènes complexes, divisez votre demande en étapes. Par exemple, "Commence par créer un arrière-plan représentant une forêt sereine et brumeuse à l'aube. Ensuite, au premier plan, ajoute un ancien autel de pierre recouvert de mousse. Enfin, placez une épée lumineuse sur l'autel."

  • Décrivez ce que vous voulez, pas ce que vous ne voulez pas : au lieu de dire "pas de voitures", décrivez la scène de manière positive en disant "une rue vide et déserte sans aucun signe de circulation".

  • Contrôler la caméra : guidez la vue de la caméra. Utilisez des termes photographiques et cinématographiques pour décrire la composition, par exemple "plan large", "macro" ou "contre-plongée".

  • Requêtes pour les images : décrivez l'intention en utilisant des expressions telles que "crée une image de" ou "génère une image de". Sinon, le modèle multimodal risque de répondre avec du texte au lieu de l'image.

  • Transmettre les signatures de pensée : lorsque vous utilisez Gemini 3 Pro Image, nous vous recommandons de transmettre les signatures de pensée au modèle lors de la création et de la modification d'images en plusieurs étapes. Cela vous permet de préserver le contexte de raisonnement lors des interactions. Pour obtenir des exemples de code liés à la modification d'images multitour à l'aide de Gemini 3 Pro Image, consultez Exemple de modification d'images multitour à l'aide de signatures de pensée.

Limites :

  • Pour des performances optimales avec Gemini 2.5 Flash Image, utilisez les langues suivantes : EN, es-MX, ja-JP, zh-CN ou hi-IN. Pour des performances optimales avec Gemini 3 Pro Image, utilisez les langues suivantes : ar-EG, de-DE, EN, es-MX, fr-FR, hi-IN, id-ID, it-IT, ja-JP, ko-KR, pt-BR, ru-RU, ua-UA, vi-VN et zh-CN.

  • La génération d'images n'est pas compatible avec les entrées audio ou vidéo.

  • Il est possible que le modèle ne crée pas le nombre exact d'images que vous demandez.

  • Pour obtenir les meilleurs résultats avec Gemini 2.5 Flash Image, incluez au maximum trois images dans une entrée. Pour obtenir les meilleurs résultats avec Gemini 3 Pro Image, incluez un maximum de 14 images dans une entrée.

  • Lorsque vous générez une image contenant du texte, commencez par générer le texte, puis générez une image avec ce texte.

  • Il est possible que la génération d'images ou de texte ne fonctionne pas comme prévu dans les cas suivants :

    • Si la requête est ambiguë, le modèle ne créera peut-être que du texte et aucune image. Si vous souhaitez obtenir des images, demandez-le clairement dans votre requête. Par exemple, "fournis des images au fur et à mesure".

    • Le modèle peut créer du texte sous forme d'image. Pour générer du texte, demandez spécifiquement une sortie textuelle. Par exemple, "génère un texte narratif avec des illustrations".

    • Le modèle peut arrêter de générer du contenu même s'il n'a pas terminé. Si cela se produit, réessayez ou utilisez un autre prompt.

    • Si un prompt est potentiellement dangereux, le modèle peut ne pas traiter la requête et renvoyer une réponse indiquant qu'il ne peut pas créer d'images dangereuses. Dans ce cas, FinishReason est STOP.

Générer des images

Les sections suivantes expliquent comment générer des images à l'aide de Vertex AI Studio ou de l'API.

Pour obtenir des conseils et connaître les bonnes pratiques concernant les requêtes, consultez Concevoir des requêtes multimodales.

Console

Pour utiliser la génération d'images :

  1. Ouvrez Vertex AI Studio > Créer un prompt.
  2. Cliquez sur Changer de modèle, puis sélectionnez l'un des modèles suivants dans le menu :
    • gemini-2.5-flash-image
    • gemini-3-pro-image-preview
  3. Dans le panneau Sorties, sélectionnez Image et texte dans le menu déroulant.
  4. Dans la zone de texte Écrivez un prompt, saisissez une description de l'image que vous souhaitez générer.
  5. Cliquez sur le bouton Requête ().

Gemini génère une image en fonction de votre description. Ce processus prend quelques secondes, mais peut être relativement plus lent en fonction de la capacité.

Python

Installer

pip install --upgrade google-genai

Pour en savoir plus, consultez la documentation de référence du SDK.

Définissez des variables d'environnement pour utiliser le SDK Gen AI avec Vertex AI :

# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
# with appropriate values for your project.
export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_VERTEXAI=True

from google import genai
from google.genai.types import GenerateContentConfig, Modality
from PIL import Image
from io import BytesIO

client = genai.Client()

response = client.models.generate_content(
    model="gemini-3-pro-image-preview",
    contents=("Generate an image of the Eiffel tower with fireworks in the background."),
    config=GenerateContentConfig(
        response_modalities=[Modality.TEXT, Modality.IMAGE],
    ),
)
for part in response.candidates[0].content.parts:
    if part.text:
        print(part.text)
    elif part.inline_data:
        image = Image.open(BytesIO((part.inline_data.data)))
        image.save("output_folder/example-image-eiffel-tower.png")

Node.js

Installer

npm install @google/genai

Pour en savoir plus, consultez la documentation de référence du SDK.

Définissez des variables d'environnement pour utiliser le SDK Gen AI avec Vertex AI :

# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
# with appropriate values for your project.
export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_VERTEXAI=True

const fs = require('fs');
const {GoogleGenAI, Modality} = require('@google/genai');

const GOOGLE_CLOUD_PROJECT = process.env.GOOGLE_CLOUD_PROJECT;
const GOOGLE_CLOUD_LOCATION =
  process.env.GOOGLE_CLOUD_LOCATION || 'us-central1';

async function generateImage(
  projectId = GOOGLE_CLOUD_PROJECT,
  location = GOOGLE_CLOUD_LOCATION
) {
  const client = new GoogleGenAI({
    vertexai: true,
    project: projectId,
    location: location,
  });

  const response = await client.models.generateContentStream({
    model: 'gemini-2.5-flash-image',
    contents:
      'Generate an image of the Eiffel tower with fireworks in the background.',
    config: {
      responseModalities: [Modality.TEXT, Modality.IMAGE],
    },
  });

  const generatedFileNames = [];
  let imageIndex = 0;

  for await (const chunk of response) {
    const text = chunk.text;
    const data = chunk.data;
    if (text) {
      console.debug(text);
    } else if (data) {
      const outputDir = 'output-folder';
      if (!fs.existsSync(outputDir)) {
        fs.mkdirSync(outputDir, {recursive: true});
      }
      const fileName = `${outputDir}/generate_content_streaming_image_${imageIndex++}.png`;
      console.debug(`Writing response image to file: ${fileName}.`);
      try {
        fs.writeFileSync(fileName, data);
        generatedFileNames.push(fileName);
      } catch (error) {
        console.error(`Failed to write image file ${fileName}:`, error);
      }
    }
  }

  // Example response:
  //  I will generate an image of the Eiffel Tower at night, with a vibrant display of
  //  colorful fireworks exploding in the dark sky behind it. The tower will be
  //  illuminated, standing tall as the focal point of the scene, with the bursts of
  //  light from the fireworks creating a festive atmosphere.

  return generatedFileNames;
}

Java

Découvrez comment installer ou mettre à jour le Java.

Pour en savoir plus, lisez la documentation de référence du SDK.

Définissez des variables d'environnement pour utiliser le SDK Gen AI avec Vertex AI :

# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
# with appropriate values for your project.
export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_VERTEXAI=True


import com.google.genai.Client;
import com.google.genai.types.Blob;
import com.google.genai.types.Candidate;
import com.google.genai.types.Content;
import com.google.genai.types.GenerateContentConfig;
import com.google.genai.types.GenerateContentResponse;
import com.google.genai.types.Part;
import com.google.genai.types.SafetySetting;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;

public class ImageGenMmFlashWithText {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String modelId = "gemini-2.5-flash-image";
    String outputFile = "resources/output/example-image-eiffel-tower.png";
    generateContent(modelId, outputFile);
  }

  // Generates an image with text input
  public static void generateContent(String modelId, String outputFile) throws IOException {
    // Client Initialization. Once created, it can be reused for multiple requests.
    try (Client client = Client.builder().location("global").vertexAI(true).build()) {

      GenerateContentConfig contentConfig =
          GenerateContentConfig.builder()
              .responseModalities("TEXT", "IMAGE")
              .candidateCount(1)
              .safetySettings(
                  SafetySetting.builder()
                      .method("PROBABILITY")
                      .category("HARM_CATEGORY_DANGEROUS_CONTENT")
                      .threshold("BLOCK_MEDIUM_AND_ABOVE")
                      .build())
              .build();

      GenerateContentResponse response =
          client.models.generateContent(
              modelId,
              "Generate an image of the Eiffel tower with fireworks in the background.",
              contentConfig);

      // Get parts of the response
      List<Part> parts =
          response
              .candidates()
              .flatMap(candidates -> candidates.stream().findFirst())
              .flatMap(Candidate::content)
              .flatMap(Content::parts)
              .orElse(new ArrayList<>());

      // For each part print text if present, otherwise read image data if present and
      // write it to the output file
      for (Part part : parts) {
        if (part.text().isPresent()) {
          System.out.println(part.text().get());
        } else if (part.inlineData().flatMap(Blob::data).isPresent()) {
          BufferedImage image =
              ImageIO.read(new ByteArrayInputStream(part.inlineData().flatMap(Blob::data).get()));
          ImageIO.write(image, "png", new File(outputFile));
        }
      }

      System.out.println("Content written to: " + outputFile);
      // Example response:
      // Here is the Eiffel Tower with fireworks in the background...
      //
      // Content written to: resources/output/example-image-eiffel-tower.png
    }
  }
}

REST

Exécutez la commande suivante dans le terminal pour créer ou écraser ce fichier dans le répertoire actuel :

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://${API_ENDPOINT}:generateContent \
  -d '{
    "contents": {
      "role": "USER",
      "parts": [
        {
          "text": "Create a tutorial explaining how to make a peanut butter and jelly sandwich in three easy steps."
        }
      ]
    },
    "generationConfig": {
      "responseModalities": ["TEXT", "IMAGE"],
      "imageConfig": {
        "aspectRatio": "16:9",
      },
     },
     "safetySettings": {
      "method": "PROBABILITY",
      "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
      "threshold": "BLOCK_MEDIUM_AND_ABOVE"
    },
  }' 2>/dev/null >response.json

Gemini génère une image en fonction de votre description. Ce processus prend quelques secondes, mais peut être relativement plus lent en fonction de la capacité.

Générer du texte entrecoupé d'images

Gemini 2.5 Flash Image peut générer des images intercalées avec ses réponses textuelles. Par exemple, vous pouvez générer des images de chaque étape d'une recette générée pour accompagner le texte de cette étape, sans avoir à envoyer de requêtes distinctes au modèle pour ce faire.

Console

Pour générer des images entrecoupées de réponses textuelles :

  1. Ouvrez Vertex AI Studio > Créer un prompt.
  2. Cliquez sur Changer de modèle, puis sélectionnez l'un des modèles suivants dans le menu :
    • gemini-2.5-flash-image
    • gemini-3-pro-image-preview
  3. Dans le panneau Sorties, sélectionnez Image et texte dans le menu déroulant.
  4. Dans la zone de texte Écrivez un prompt, saisissez une description de l'image que vous souhaitez générer. Par exemple, "Crée un tutoriel expliquant comment faire un sandwich au beurre de cacahuète et à la confiture en trois étapes simples. Pour chaque étape, fournis un titre avec le numéro de l'étape, une explication et génère également une image au format 1:1."
  5. Cliquez sur le bouton Requête ().

Gemini générera une réponse en fonction de votre description. Ce processus prend quelques secondes, mais peut être relativement plus lent en fonction de la capacité.

Python

Installer

pip install --upgrade google-genai

Pour en savoir plus, consultez la documentation de référence du SDK.

Définissez des variables d'environnement pour utiliser le SDK Gen AI avec Vertex AI :

# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
# with appropriate values for your project.
export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_VERTEXAI=True

from google import genai
from google.genai.types import GenerateContentConfig, Modality
from PIL import Image
from io import BytesIO

client = genai.Client()

response = client.models.generate_content(
    model="gemini-3-pro-image-preview",
    contents=(
        "Generate an illustrated recipe for a paella."
        "Create images to go alongside the text as you generate the recipe"
    ),
    config=GenerateContentConfig(response_modalities=[Modality.TEXT, Modality.IMAGE]),
)
with open("output_folder/paella-recipe.md", "w") as fp:
    for i, part in enumerate(response.candidates[0].content.parts):
        if part.text is not None:
            fp.write(part.text)
        elif part.inline_data is not None:
            image = Image.open(BytesIO((part.inline_data.data)))
            image.save(f"output_folder/example-image-{i+1}.png")
            fp.write(f"![image](example-image-{i+1}.png)")

Java

Découvrez comment installer ou mettre à jour le Java.

Pour en savoir plus, lisez la documentation de référence du SDK.

Définissez des variables d'environnement pour utiliser le SDK Gen AI avec Vertex AI :

# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
# with appropriate values for your project.
export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_VERTEXAI=True


import com.google.genai.Client;
import com.google.genai.types.Blob;
import com.google.genai.types.Candidate;
import com.google.genai.types.Content;
import com.google.genai.types.GenerateContentConfig;
import com.google.genai.types.GenerateContentResponse;
import com.google.genai.types.Part;
import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;

public class ImageGenMmFlashTextAndImageWithText {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String modelId = "gemini-2.5-flash-image";
    String outputFile = "resources/output/paella-recipe.md";
    generateContent(modelId, outputFile);
  }

  // Generates text and image with text input
  public static void generateContent(String modelId, String outputFile) throws IOException {
    // Client Initialization. Once created, it can be reused for multiple requests.
    try (Client client = Client.builder().location("global").vertexAI(true).build()) {

      GenerateContentResponse response =
          client.models.generateContent(
              modelId,
              Content.fromParts(
                  Part.fromText("Generate an illustrated recipe for a paella."),
                  Part.fromText(
                      "Create images to go alongside the text as you generate the recipe.")),
              GenerateContentConfig.builder().responseModalities("TEXT", "IMAGE").build());

      try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {

        // Get parts of the response
        List<Part> parts =
            response
                .candidates()
                .flatMap(candidates -> candidates.stream().findFirst())
                .flatMap(Candidate::content)
                .flatMap(Content::parts)
                .orElse(new ArrayList<>());

        int index = 1;
        // For each part print text if present, otherwise read image data if present and
        // write it to the output file
        for (Part part : parts) {
          if (part.text().isPresent()) {
            writer.write(part.text().get());
          } else if (part.inlineData().flatMap(Blob::data).isPresent()) {
            BufferedImage image =
                ImageIO.read(new ByteArrayInputStream(part.inlineData().flatMap(Blob::data).get()));
            ImageIO.write(
                image, "png", new File("resources/output/example-image-" + index + ".png"));
            writer.write("![image](example-image-" + index + ".png)");
          }
          index++;
        }

        System.out.println("Content written to: " + outputFile);

        // Example response:
        // A markdown page for a Paella recipe(`paella-recipe.md`) has been generated.
        // It includes detailed steps and several images illustrating the cooking process.
        //
        // Content written to:  resources/output/paella-recipe.md
      }
    }
  }
}

REST

Exécutez la commande suivante dans le terminal pour créer ou écraser ce fichier dans le répertoire actuel :

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://${API_ENDPOINT}:generateContent \
  -d '{
    "contents": {
      "role": "USER",
      "parts": [
        {
          "text": "Create a tutorial explaining how to make a peanut butter and jelly sandwich in three easy steps. For each step, provide a title with the number of the step, an explanation, and also generate an image, generate each image in a 1:1 aspect ratio."
        }
      ]
    },
    "generationConfig": {
      "responseModalities": ["TEXT", "IMAGE"],
      "imageConfig": {
        "aspectRatio": "16:9",
      },
    },
    "safetySettings": {
      "method": "PROBABILITY",
      "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
      "threshold": "BLOCK_MEDIUM_AND_ABOVE"
    },
  }' 2>/dev/null >response.json

Gemini génère une image en fonction de votre description. Ce processus prend quelques secondes, mais peut être relativement plus lent en fonction de la capacité.

Modifier des images

Gemini 2.5 Flash Image pour la génération d'images (gemini-2.5-flash-image) permet de modifier les images en plus de les générer. Gemini 2.5 Flash Image permet de modifier plus facilement les images et d'effectuer des modifications en plusieurs étapes. Il contient également des filtres de sécurité mis à jour qui offrent une expérience utilisateur plus flexible et moins restrictive.

Il est compatible avec les modalités et les fonctionnalités suivantes :

  • Retouche d'images (texte vers image et image vers image)

    • Exemple de requête : "Modifie cette image pour qu'elle ressemble à un dessin animé"
    • Exemple de requête : [image de chat] + [image d'oreiller] + "Crée un point de croix de mon chat sur cet oreiller."
  • Édition d'images multitour (chat)

    • Exemples de requêtes : [importe une image d'une voiture bleue.] "Transforme cette voiture en cabriolet."

      • [Le modèle renvoie une image d'un cabriolet dans la même scène] "Maintenant, change la couleur en jaune."
      • [Le modèle renvoie une image d'un cabriolet jaune] "Ajoute un spoiler."
      • [Le modèle renvoie une image du cabriolet avec un spoiler]

Modifier une image

Console

Pour modifier des images :

  1. Ouvrez Vertex AI Studio > Créer un prompt.
  2. Cliquez sur Changer de modèle, puis sélectionnez l'un des modèles suivants dans le menu :
    • gemini-2.5-flash-image
    • gemini-3-pro-image-preview
  3. Dans le panneau Sorties, sélectionnez Image et texte dans le menu déroulant.
  4. Cliquez sur Insérer un média (), sélectionnez une source dans le menu, puis suivez les instructions de la boîte de dialogue.
  5. Dans la zone de texte Écrivez un prompt, décrivez les modifications que vous souhaitez apporter à l'image.
  6. Cliquez sur le bouton Requête ().

Gemini générera une version modifiée de l'image fournie en fonction de votre description. Ce processus prend quelques secondes, mais peut être relativement plus lent en fonction de la capacité.

Python

Installer

pip install --upgrade google-genai

Pour en savoir plus, consultez la documentation de référence du SDK.

Définissez des variables d'environnement pour utiliser le SDK Gen AI avec Vertex AI :

# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
# with appropriate values for your project.
export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_VERTEXAI=True

from google import genai
from google.genai.types import GenerateContentConfig, Modality
from PIL import Image
from io import BytesIO

client = genai.Client()

# Using an image of Eiffel tower, with fireworks in the background.
image = Image.open("test_resources/example-image-eiffel-tower.png")

response = client.models.generate_content(
    model="gemini-3-pro-image-preview",
    contents=[image, "Edit this image to make it look like a cartoon."],
    config=GenerateContentConfig(response_modalities=[Modality.TEXT, Modality.IMAGE]),
)
for part in response.candidates[0].content.parts:
    if part.text:
        print(part.text)
    elif part.inline_data:
        image = Image.open(BytesIO((part.inline_data.data)))
        image.save("output_folder/bw-example-image.png")

Java

Découvrez comment installer ou mettre à jour le Java.

Pour en savoir plus, lisez la documentation de référence du SDK.

Définissez des variables d'environnement pour utiliser le SDK Gen AI avec Vertex AI :

# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
# with appropriate values for your project.
export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_VERTEXAI=True


import com.google.genai.Client;
import com.google.genai.types.Blob;
import com.google.genai.types.Candidate;
import com.google.genai.types.Content;
import com.google.genai.types.GenerateContentConfig;
import com.google.genai.types.GenerateContentResponse;
import com.google.genai.types.Part;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;

public class ImageGenMmFlashEditImageWithTextAndImage {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String modelId = "gemini-2.5-flash-image";
    String outputFile = "resources/output/bw-example-image.png";
    generateContent(modelId, outputFile);
  }

  // Edits an image with image and text input
  public static void generateContent(String modelId, String outputFile) throws IOException {
    // Client Initialization. Once created, it can be reused for multiple requests.
    try (Client client = Client.builder().location("global").vertexAI(true).build()) {

      byte[] localImageBytes =
          Files.readAllBytes(Paths.get("resources/example-image-eiffel-tower.png"));

      GenerateContentResponse response =
          client.models.generateContent(
              modelId,
              Content.fromParts(
                  Part.fromBytes(localImageBytes, "image/png"),
                  Part.fromText("Edit this image to make it look like a cartoon.")),
              GenerateContentConfig.builder().responseModalities("TEXT", "IMAGE").build());

      // Get parts of the response
      List<Part> parts =
          response
              .candidates()
              .flatMap(candidates -> candidates.stream().findFirst())
              .flatMap(Candidate::content)
              .flatMap(Content::parts)
              .orElse(new ArrayList<>());

      // For each part print text if present, otherwise read image data if present and
      // write it to the output file
      for (Part part : parts) {
        if (part.text().isPresent()) {
          System.out.println(part.text().get());
        } else if (part.inlineData().flatMap(Blob::data).isPresent()) {
          BufferedImage image =
              ImageIO.read(new ByteArrayInputStream(part.inlineData().flatMap(Blob::data).get()));
          ImageIO.write(image, "png", new File(outputFile));
        }
      }

      System.out.println("Content written to: " + outputFile);

      // Example response:
      // No problem! Here's the image in a cartoon style...
      //
      // Content written to: resources/output/bw-example-image.png
    }
  }
}

REST

Exécutez la commande suivante dans le terminal pour créer ou écraser ce fichier dans le répertoire actuel :

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://${API_ENDPOINT}:generateContent \
  -d '{
    "contents": {
      "role": "USER",
      "parts": [
        {"fileData": {
          "mimeType": "image/jpg",
          "fileUri": "FILE_NAME"
          }
        },
        {"text": "Convert this photo to black and white, in a cartoonish style."},
      ]

    },
    "generationConfig": {
      "responseModalities": ["TEXT", "IMAGE"],
      "imageConfig": {
        "aspectRatio": "16:9",
      },
    },
    "safetySettings": {
      "method": "PROBABILITY",
      "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
      "threshold": "BLOCK_MEDIUM_AND_ABOVE"
    },
  }' 2>/dev/null >response.json

Gemini génère une image en fonction de votre description. Ce processus prend quelques secondes, mais peut être relativement plus lent en fonction de la capacité.

Modification d'images multitour

Les modèles Gemini 2.5 Flash Image et Gemini 3 Pro Image permettent une retouche multitour améliorée. Vous pouvez ainsi répondre au modèle en lui indiquant les modifications à apporter après avoir reçu une image retouchée. Vous pouvez ainsi continuer à modifier l'image de manière conversationnelle.

Notez qu'il est recommandé de limiter la taille totale du fichier de requête à 50 Mo maximum.

Pour tester l'édition d'images en plusieurs étapes, essayez les notebooks suivants :

Pour obtenir des exemples de code liés à la création et à la modification d'images multitours à l'aide de Gemini 3 Pro Image, consultez Exemple de modification d'images multitours à l'aide de signatures de pensée.

Une IA responsable

Pour garantir une expérience sûre et responsable, les fonctionnalités de génération d'images de Vertex AI sont équipées d'une approche de sécurité multicouche. Cela permet d'éviter la création de contenus inappropriés, y compris à caractère sexuel explicite, dangereux, violent, haineux ou toxiques.

Tous les utilisateurs doivent respecter le Règlement sur les utilisations interdites de l'IA générative. Ce règlement interdit strictement la génération de contenus qui :

  • sont liés à l'exploitation ou aux abus sexuels sur des mineurs ;
  • facilitent l'extrémisme violent ou le terrorisme ;
  • facilitent le partage non consenti d'images intimes ; facilitent l'automutilation ;
  • le contenu à caractère sexuel explicite ;
  • constitue une incitation à la haine ;
  • encourage le harcèlement ou l'intimidation ;

Lorsqu'une requête non sécurisée est fournie, le modèle peut refuser de générer une image, ou la requête ou la réponse générée peuvent être bloquées par nos filtres de sécurité.

  • Refus du modèle : si une requête est potentiellement dangereuse, le modèle peut refuser de la traiter. Dans ce cas, le modèle fournit généralement une réponse textuelle indiquant qu'il ne peut pas générer d'images dangereuses. FinishReason sera STOP.
  • Blocage du filtre de sécurité :
    • Si le filtre de sécurité identifie le prompt comme potentiellement dangereux, l'API renvoie BlockedReason dans PromptFeedback.
    • Si un filtre de sécurité identifie la réponse comme potentiellement dangereuse, la réponse de l'API inclut un FinishReason de IMAGE_SAFETY, IMAGE_PROHIBITED_CONTENT ou similaire.

Catégories de codes de filtre de sécurité

Selon les filtres de sécurité que vous configurez, la sortie peut contenir un code de motif de sécurité semblable à celui-ci :

    {
      "raiFilteredReason": "ERROR_MESSAGE. Support codes: 56562880"
    }

Le code indiqué correspond à une catégorie de contenu nuisible spécifique. Voici les catégories auxquelles correspondent les codes :

Code d'erreur Catégorie de sécurité Description Contenu filtré : prompt d'entrée ou image de sortie
58061214
17301594
Enfant Détecte les contenus comportant des enfants s'ils ne sont pas autorisés dans les paramètres de la requête API ou dans la liste d'autorisation. entrée (prompt) : 58061214
sortie (image) : 17301594
29310472
15236754
Célébrité Détecte une représentation photoréaliste d'une célébrité dans la requête. entrée (requête) : 29310472
sortie (image) : 15236754
62263041 Contenu dangereux Détecte les contenus potentiellement dangereux. entrée (prompt)
57734940
22137204
Contenu haineux Détecte les sujets ou les contenus incitant à la haine. entrée (requête) : 57734940
sortie (image) : 22137204
74803281
29578790
42876398
Autre Détecte d'autres problèmes de sécurité liés à la requête. entrée (prompt) : 42876398
sortie (image) : 29578790, 74803281
39322892 Personnes/Visages Détecte les personnes ou les visages s'ils ne sont pas autorisés dans les paramètres de sécurité de la requête. sortie (image)
92201652 Informations personnelles Détecte les informations permettant d'identifier personnellement l'utilisateur dans le texte, telles que les numéros de carte de crédit, les adresses personnelles ou d'autres informations de ce type. entrée (prompt)
89371032
49114662
72817394
Contenu interdit Détecte les contenus interdits dans la requête. entrée (prompt) : 89371032
sortie (image) : 49114662, 72817394
90789179
63429089
43188360
Contenu à caractère sexuel Détecte les contenus à caractère sexuel. entrée (requête) : 90789179
sortie (image) : 63429089, 43188360
78610348 Contenu toxique Détecte les sujets ou contenus toxiques dans le texte. entrée (prompt)
61493863
56562880
Violence Détecte les contenus violents dans l'image ou le texte. entrée (requête) : 61493863
sortie (image) : 56562880
32635315 Contenu vulgaire Détecte les sujets ou contenus vulgaires dans le texte. entrée (prompt)
64151117 Célébrité ou enfant Détecte une représentation photoréaliste d'une célébrité ou d'un enfant qui enfreint les règles de sécurité de Google. entrée (requête)
sortie (image)