Gerar imagens

A API Gemini oferece suporte à geração de imagens usando o Gemini 2.0 Flash Experimental e usando o Imagen 3. Este guia ajuda você a começar a usar os dois modelos.

Gerar imagens usando o Gemini

O Gemini 2.0 Flash Experimental oferece suporte à capacidade de gerar texto e imagens inline. Isso permite que você use o Gemini para editar imagens em uma conversa ou gerar saídas com texto entrelaçado (por exemplo, gerar uma postagem de blog com texto e imagens em uma única vez). Todas as imagens geradas incluem uma marca-d'água SynthID, e as imagens no Google AI Studio também incluem uma marca-d'água visível.

O exemplo a seguir mostra como usar o Gemini 2.0 para gerar saída de texto e imagem:

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

O exemplo de código deve gerar uma imagem e talvez texto.

Imagem de um porco voador fantástico gerada por IA

Dependendo do comando e do contexto, o Gemini vai gerar conteúdo em diferentes modos (texto para imagem, texto para imagem e texto, etc.). Veja alguns exemplos:

  • Texto para imagem
    • Exemplo de comando: "Gere uma imagem da Torre Eiffel com fogos de artifício em segundo plano".
  • Texto para imagens e texto (intercalado)
    • Exemplo de comando: "Gerencie uma receita ilustrada de paella."
  • Imagens e texto para imagens e texto (intercalados)
    • Exemplo de comando: (com uma imagem de um cômodo mobiliado) "Que outras cores de sofás funcionariam no meu espaço? Você pode atualizar a imagem?"
  • Edição de imagens (texto e imagem para imagem)
    • Exemplo de instrução: "Edite esta imagem para que ela pareça um desenho animado"
    • Exemplo de comando: [imagem de um gato] + [imagem de um travesseiro] + "Crie um ponto cruz do meu gato neste travesseiro".
  • Edição de imagens com vários turnos (chat)
    • Exemplos de comandos: [faça upload de uma imagem de um carro azul.] "Transforme este carro em um conversível." "Agora mude a cor para amarelo."

Edição de imagens com o Gemini

Para fazer a edição, adicione uma imagem como entrada. O exemplo a seguir demonstra o envio de imagens codificadas em base64. Para várias imagens e payloads maiores, consulte a seção Entrada de imagem.

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

Limitações

  • Para ter o melhor desempenho, use os seguintes idiomas: EN, es-MX, ja-JP, zh-CN, hi-IN.
  • A geração de imagens não tem suporte para entradas de áudio ou vídeo.
  • A geração de imagens nem sempre aciona:
    • O modelo pode gerar apenas texto. Peça explicitamente as saídas de imagem (por exemplo, "gerar uma imagem", "fornecer imagens conforme você avança", "atualizar a imagem").
    • O modelo pode parar de gerar no meio do processo. Tente de novo ou use outro comando.
  • Ao gerar texto para uma imagem, o Gemini funciona melhor se você gerar primeiro o texto e depois pedir uma imagem com o texto.

Escolher um modelo

Qual modelo você deve usar para gerar imagens? Depende do seu caso de uso.

O Gemini 2.0 é o melhor para produzir imagens relevantes do ponto de vista contextual, combinando texto e imagens, incorporando conhecimento geral e raciocinando sobre imagens. Você pode usá-lo para criar recursos visuais precisos e relevantes para o contexto incorporados em longas sequências de texto. Você também pode editar imagens de forma conversacional, usando linguagem natural, mantendo o contexto durante a conversa.

Se a qualidade da imagem for sua prioridade, o Imagen 3 é a melhor escolha. O Imagen 3 se destaca em fotorrealismo, detalhes artísticos e estilos artísticos específicos, como impressionismo ou anime. O Imagen 3 também é uma boa escolha para tarefas especializadas de edição de imagens, como atualizar planos de fundo de produtos, aumentar o tamanho de imagens e infundir branding e estilo nos recursos visuais. Você pode usar o Imagen 3 para criar logotipos ou outros designs de produtos de marca.

Gerar imagens usando o Imagen 3

A API Gemini oferece acesso ao Imagen 3, o modelo de conversão de texto em imagem de maior qualidade do Google, com vários recursos novos e aprimorados. O Imagen 3 pode fazer o seguinte:

  • Gerar imagens com mais detalhes, iluminação mais rica e menos artefatos distrativos do que os modelos anteriores
  • Entender comandos escritos em linguagem natural
  • Gerar imagens em vários formatos e estilos
  • Renderizar texto de maneira mais eficaz do que os modelos anteriores

Exemplo de Imagen

Esta seção mostra como instanciar um modelo do Imagen e gerar imagens.

Depois de instalar o SDK da Google Gen AI, use o código abaixo para gerar imagens:

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
        }
      }'

O exemplo de código vai gerar quatro imagens semelhantes a esta:

Imagem gerada por IA de dois coelhos fofos na cozinha

Você também pode testar o notebook de Introdução ao Imagen no Gemini Cookbook.

Parâmetros do modelo do Imagen

Os seguintes parâmetros estão disponíveis para generate_images():

  • prompt: o comando de texto para a imagem.
  • number_of_images: o número de imagens a serem geradas, de 1 a 4. O padrão é 4.
  • aspect_ratio: muda a proporção da imagem gerada. Os valores aceitos são "1:1", "3:4", "4:3", "9:16" e "16:9". O padrão é "1:1".
  • safety_filter_level: adiciona um nível de filtro à filtragem de segurança. Os seguintes valores são válidos:
    • "BLOCK_LOW_AND_ABOVE": bloqueia quando a pontuação de probabilidade ou de gravidade é LOW, MEDIUM ou HIGH.
    • "BLOCK_MEDIUM_AND_ABOVE": bloqueia quando a pontuação de probabilidade ou de gravidade é MEDIUM ou HIGH.
    • "BLOCK_ONLY_HIGH": bloqueia quando a pontuação de probabilidade ou de gravidade é HIGH.
  • person_generation: permite que o modelo gere imagens de pessoas. Os seguintes valores são aceitos:
    • "DONT_ALLOW": bloqueia a geração de imagens de pessoas.
    • "ALLOW_ADULT": gera imagens de adultos, mas não de crianças. Esse é o padrão.

Uma marca-d'água digital SynthID não visível é sempre adicionada às imagens geradas.

Idioma do comando de texto

Os seguintes idiomas de comando de texto de entrada são aceitos:

  • Inglês (en)

A seguir