Générer des images

L'API Gemini prend en charge la génération d'images à l'aide de Gemini 2.0 Flash Experimental et à l'aide d'Imagen 3. Ce guide vous aidera à vous lancer avec les deux modèles.

Générer des images à l'aide de Gemini

Gemini 2.0 Flash Experimental permet de générer du texte et des images intégrées. Vous pouvez ainsi utiliser Gemini pour modifier des images de manière conversationnelle ou générer des sorties avec du texte entrelacé (par exemple, générer un article de blog avec du texte et des images en une seule phrase). Toutes les images générées incluent un filigrane SynthID, et les images de Google AI Studio incluent également un filigrane visible.

L'exemple suivant montre comment utiliser Gemini 2.0 pour générer une sortie texte et image:

from google import genai
from google.genai import types
from PIL import Image
from io import BytesIO
import base64

client = genai.Client()

contents = ('Hi, can you create a 3d rendered image of a pig '
            'with wings and a top hat flying over a happy '
            'futuristic scifi city with lots of greenery?')

response = client.models.generate_content(
    model="gemini-2.0-flash-exp-image-generation",
    contents=contents,
    config=types.GenerateContentConfig(
      response_modalities=['Text', 'Image']
    )
)

for part in response.candidates[0].content.parts:
  if part.text is not None:
    print(part.text)
  elif part.inline_data is not None:
    image = Image.open(BytesIO((part.inline_data.data)))
    image.save('gemini-native-image.png')
    image.show()
const { GoogleGenerativeAI } = require("@google/generative-ai");
const fs = require("fs");

const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);

async function generateImage() {
  const contents = "Hi, can you create a 3d rendered image of a pig " +
                  "with wings and a top hat flying over a happy " +
                  "futuristic scifi city with lots of greenery?";

  // Set responseModalities to include "Image" so the model can generate  an image
  const model = genAI.getGenerativeModel({
    model: "gemini-2.0-flash-exp-image-generation",
    generationConfig: {
        responseModalities: ['Text', 'Image']
    },
  });

  try {
    const response = await model.generateContent(contents);
    for (const part of  response.response.candidates[0].content.parts) {
      // Based on the part type, either show the text or save the image
      if (part.text) {
        console.log(part.text);
      } else if (part.inlineData) {
        const imageData = part.inlineData.data;
        const buffer = Buffer.from(imageData, 'base64');
        fs.writeFileSync('gemini-native-image.png', buffer);
        console.log('Image saved as gemini-native-image.png');
      }
    }
  } catch (error) {
    console.error("Error generating content:", error);
  }
}

generateImage();
curl -s -X POST \
  "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp-image-generation:generateContent?key=$GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [{
      "parts": [
        {"text": "Hi, can you create a 3d rendered image of a pig with wings and a top hat flying over a happy futuristic scifi city with lots of greenery?"}
      ]
    }],
    "generationConfig":{"responseModalities":["Text","Image"]}
  }' \
  | grep -o '"data": "[^"]*"' \
  | cut -d'"' -f4 \
  | base64 --decode > gemini-native-image.png

L'exemple de code doit générer une image et peut également générer du texte.

Image générée par IA d'un cochon volant fantastique

En fonction de la requête et du contexte, Gemini génère du contenu dans différents modes (texte vers image, texte vers image et texte, etc.). Voici quelques exemples :

  • 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 une ou plusieurs images et texte (entrelacé)
    • Exemple de requête : "Génère une recette illustrée pour une paella."
  • Image(s) et texte vers image(s) et texte (entrelacé)
    • Exemple de requête : (avec une image d'une pièce meublée) "Quelle autre couleur de canapé irait bien dans mon espace ? Pouvez-vous mettre à jour l'image ?"
  • Modification d'images (texte et image vers image)
    • Exemple de requête : "Modifiez cette image pour qu'elle ressemble à un dessin animé"
    • Exemple de requête : [image d'un chat] + [image d'un oreiller] + "Crée un point de croix de mon chat sur cet oreiller."
  • Modification d'images multitours (chat)
    • Exemples de requêtes : [importez une image d'une voiture bleue.] "Transformez cette voiture en cabriolet." "Maintenant, changez la couleur en jaune."

Modifier des images avec Gemini

Pour effectuer une modification d'image, ajoutez une image en entrée. L'exemple suivant montre comment importer des images encodées en base64. Pour plusieurs images et des charges utiles plus importantes, consultez la section Entrée d'image.

from google import genai
from google.genai import types
from PIL import Image
from io import BytesIO

import PIL.Image

image = PIL.Image.open('/path/to/image.png')

client = genai.Client()

text_input = ('Hi, This is a picture of me.'
            'Can you add a llama next to me?',)

response = client.models.generate_content(
    model="gemini-2.0-flash-exp-image-generation",
    contents=[text_input, image],
    config=types.GenerateContentConfig(
      response_modalities=['Text', 'Image']
    )
)

for part in response.candidates[0].content.parts:
  if part.text is not None:
    print(part.text)
  elif part.inline_data is not None:
    image = Image.open(BytesIO(part.inline_data.data))
    image.show()
const { GoogleGenerativeAI } = require("@google/generative-ai");
const fs = require("fs");

const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);

async function generateImage() {
    // Load the image from the local file system
    const imagePath = '/path/to/image.png';
    const imageData = fs.readFileSync(imagePath);
    const base64Image = imageData.toString('base64');

    // Prepare the content parts
    const contents = [
        { text: "Hi, This is a picture of me. Can you add a llama next to me?" },
        {
          inlineData: {
            mimeType: 'image/png',
            data: base64Image
          }
        }
      ];

  // Set responseModalities to include "Image" so the model can generate an image
  const model = genAI.getGenerativeModel({
    model: "gemini-2.0-flash-exp-image-generation",
    generationConfig: {
        responseModalities: ['Text', 'Image']
    },
  });

  try {
    const response = await model.generateContent(contents);
    for (const part of  response.response.candidates[0].content.parts) {
      // Based on the part type, either show the text or save the image
      if (part.text) {
        console.log(part.text);
      } else if (part.inlineData) {
        const imageData = part.inlineData.data;
        const buffer = Buffer.from(imageData, 'base64');
        fs.writeFileSync('gemini-native-image.png', buffer);
        console.log('Image saved as gemini-native-image.png');
      }
    }
  } catch (error) {
    console.error("Error generating content:", error);
  }
}

generateImage();
IMG_PATH=/path/to/your/image1.jpeg

if [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
  B64FLAGS="--input"
else
  B64FLAGS="-w0"
fi

IMG_BASE64=$(base64 "$B64FLAGS" "$IMG_PATH" 2>&1)

curl -X POST \
  "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp-image-generation:generateContent?key=$GEMINI_API_KEY" \
    -H 'Content-Type: application/json' \
    -d "{
      \"contents\": [{
        \"parts\":[
            {\"text\": \"'Hi, This is a picture of me. Can you add a llama next to me\"},
            {
              \"inline_data\": {
                \"mime_type\":\"image/jpeg\",
                \"data\": \"$IMG_BASE64\"
              }
            }
        ]
      }],
      \"generationConfig\": {\"responseModalities\": [\"Text\", \"Image\"]}
    }"  \
  | grep -o '"data": "[^"]*"' \
  | cut -d'"' -f4 \
  | base64 --decode > gemini-edited-image.png

Limites

  • Pour des performances optimales, utilisez les langues suivantes: EN, es-MX, ja-JP, zh-CN et hi-IN.
  • La génération d'images n'est pas compatible avec les entrées audio ni vidéo.
  • La génération d'images ne se déclenche pas toujours :
    • Le modèle peut ne générer que du texte. Essayez de demander explicitement des sorties d'image (par exemple, "générer une image", "fournir des images au fur et à mesure", "mettre à jour l'image").
    • Le modèle peut s'arrêter en cours de génération. Réessayez ou utilisez une autre requête.
  • Lorsque vous générez du texte pour une image, Gemini fonctionne mieux si vous générez d'abord le texte, puis demandez une image avec le texte.

Choisir un modèle

Quel modèle devez-vous utiliser pour générer des images ? Cela dépend de votre cas d'utilisation.

Gemini 2.0 est idéal pour produire des images pertinentes dans le contexte, mélanger du texte et des images, intégrer des connaissances du monde et raisonner sur les images. Vous pouvez l'utiliser pour créer des visuels précis et pertinents dans le contexte, intégrés à de longues séquences de texte. Vous pouvez également modifier des images de manière conversationnelle, en utilisant un langage naturel, tout en conservant le contexte tout au long de la conversation.

Si la qualité de l'image est votre priorité absolue, Imagen 3 est la meilleure option. Imagen 3 excelle dans le photoréalisme, les détails artistiques et les styles artistiques spécifiques tels que l'impressionnisme ou l'anime. Imagen 3 est également un bon choix pour les tâches de retouche d'images spécialisées, comme la mise à jour des arrière-plans de produits, l'amélioration de la résolution des images et l'intégration de branding et de style dans les visuels. Vous pouvez utiliser Imagen 3 pour créer des logos ou d'autres conceptions de produits de marque.

Générer des images à l'aide d'Imagen 3

L'API Gemini donne accès à Imagen 3, le modèle texte-vers-image de Google de la plus haute qualité, qui offre un certain nombre de nouvelles fonctionnalités améliorées. Voici ce que vous pouvez faire avec Imagen 3:

  • Générer des images avec des détails plus précis, un éclairage plus riche et moins d'artefacts gênants que les modèles précédents
  • Comprendre les requêtes rédigées en langage naturel
  • Générer des images dans un large éventail de formats et de styles
  • Afficher le texte plus efficacement que les modèles précédents

Exemple d'utilisation d'Imagen

Cette section explique comment instancier un modèle Imagen et générer des images.

Après avoir installé le SDK Google Gen AI, vous pouvez utiliser le code suivant pour générer des images:

from google import genai
from google.genai import types
from PIL import Image
from io import BytesIO

client = genai.Client(api_key='GEMINI_API_KEY')

response = client.models.generate_images(
    model='imagen-3.0-generate-002',
    prompt='Fuzzy bunnies in my kitchen',
    config=types.GenerateImagesConfig(
        number_of_images= 4,
    )
)
for generated_image in response.generated_images:
  image = Image.open(BytesIO(generated_image.image.image_bytes))
  image.show()
curl -X POST \
    "https://generativelanguage.googleapis.com/v1beta/models/imagen-3.0-generate-002:predict?key=GEMINI_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
        "instances": [
          {
            "prompt": "Fuzzy bunnies in my kitchen"
          }
        ],
        "parameters": {
          "sampleCount": 4
        }
      }'

L'exemple de code doit générer quatre images semblables à celle-ci:

Image générée par IA de deux lapins dans la cuisine

Vous pouvez également essayer le notebook Premiers pas avec Imagen dans le Cookbook Gemini.

Paramètres du modèle Imagen

Les paramètres suivants sont disponibles pour generate_images():

  • prompt: requête textuelle pour l'image.
  • number_of_images: nombre d'images à générer, compris entre 1 et 4 (inclus). La valeur par défaut est 4.
  • aspect_ratio: modifie le format de l'image générée. Les valeurs acceptées sont "1:1", "3:4", "4:3", "9:16" et "16:9". La valeur par défaut est "1:1".
  • safety_filter_level: ajoute un niveau de filtre au filtrage de sécurité. Les valeurs suivantes sont valides :
    • "BLOCK_LOW_AND_ABOVE": bloquer lorsque le score de probabilité ou le score de gravité est LOW, MEDIUM ou HIGH.
    • "BLOCK_MEDIUM_AND_ABOVE": bloquer lorsque le score de probabilité ou le score de gravité est MEDIUM ou HIGH.
    • "BLOCK_ONLY_HIGH": bloquer lorsque le score de probabilité ou le score de gravité est HIGH.
  • person_generation: autoriser le modèle à générer des images de personnes. Les valeurs suivantes sont acceptées :
    • "DONT_ALLOW": bloquer la génération d'images de personnes.
    • "ALLOW_ADULT": générer des images d'adultes, mais pas d'enfants Ce paramètre est la valeur par défaut.

Un filigrane numérique SynthID non visible est toujours ajouté aux images générées.

Langue de la requête textuelle

Les langues de requêtes textuelles d'entrée suivantes sont acceptées:

  • Anglais (en)

Étape suivante