Gerar e editar imagens com o Gemini

Os seguintes modelos do Gemini podem gerar imagens além de texto:

  • Gemini 2.5 Flash Image, também conhecido como Gemini 2.5 Flash (com Nano Banana)

  • Gemini 3 Pro Image (pré-lançamento), também conhecido como Gemini 3 Pro (com Nano Banana)

Isso amplia os recursos do Gemini para incluir o seguinte:

  • Gere imagens de forma iterativa por conversa em linguagem natural, ajustando as imagens e mantendo a consistência e o contexto.
  • Gere imagens com renderização de texto longo de alta qualidade.
  • Gere uma saída intercalada de texto e imagem. Por exemplo, uma postagem de blog com texto e imagens em uma única interação. Antes, isso exigia a combinação de vários modelos.
  • Gere imagens usando o conhecimento de mundo e os recursos de raciocínio do Gemini.

O Gemini 2.5 Flash Image (gemini-2.5-flash-image) e a prévia de imagens do Gemini 3 Pro (gemini-3-pro-image-preview) oferecem suporte à geração de imagens de pessoas e têm filtros de segurança atualizados que proporcionam uma experiência do usuário mais flexível e menos restritiva. O Gemini 2.5 Flash Image pode gerar imagens em 1024 px. O Gemini 3 Pro Image pode gerar imagens de até 4096 px.

Os dois modelos oferecem suporte às seguintes modalidades e recursos:

  • Texto para imagem

    • Exemplo de comando: "Gere uma imagem da Torre Eiffel com fogos de artifício ao fundo".
  • Texto para imagem (renderização de texto)

    • Exemplo de comando: "gere uma foto cinematográfica de um prédio grande com esta projeção de texto gigante mapeada na frente do prédio: "O Gemini 3 agora pode gerar textos longos""
  • Texto para imagens e texto (intercalado)

    • Exemplo de comando: "Gere uma receita ilustrada de paella. Crie imagens ao lado do texto enquanto gera a receita".
    • Exemplo de comando: "Gere uma história sobre um cachorro em um estilo de animação de desenho animado em 3D. Para cada cena, gere uma imagem"
  • Imagens e texto para imagens e texto (intercalados)

    • Comando de exemplo: (com uma imagem de um quarto mobiliado) "Quais outras cores de sofás ficariam boas no meu espaço? Você pode atualizar a imagem?"

Práticas recomendadas

Para melhorar os resultados da geração de imagens, siga estas práticas recomendadas:

  • Seja específico:mais detalhes dão mais controle. Por exemplo, em vez de "armadura de fantasia", tente "armadura de placa élfica ornamentada, gravada com padrões de folha de prata, com uma gola alta e ombreiras em forma de asas de falcão".

  • Forneça contexto e intenção:explique a finalidade da imagem para ajudar o modelo a entender o contexto. Por exemplo, "Crie um logotipo para uma marca de cuidados com a pele sofisticada e minimalista" funciona melhor do que "Crie um logotipo".

  • Itere e refine:não espere uma imagem perfeita na primeira tentativa. Use comandos complementares para fazer pequenas mudanças, por exemplo, "Deixe a iluminação mais quente" ou "Mude a expressão do personagem para mais séria".

  • Use instruções detalhadas:para cenas complexas, divida seu pedido em etapas. Por exemplo: "Primeiro, crie um plano de fundo de uma floresta serena e enevoada ao amanhecer. Em seguida, em primeiro plano, adicione um altar de pedra antigo coberto de musgo. Por fim, coloque uma única espada brilhante em cima do altar."

  • Descreva o que você quer, não o que você não quer:em vez de dizer "sem carros", descreva a cena de forma positiva dizendo "uma rua vazia e deserta sem sinais de trânsito".

  • Controlar a câmera:guie a visualização da câmera. Use termos fotográficos e cinematográficos para descrever a composição, por exemplo, "plano aberto", "macro" ou "perspectiva de baixo ângulo".

  • Comando para imagens:descreva a intenção usando frases como "crie uma imagem de" ou "gere uma imagem de". Caso contrário, o modelo multimodal pode responder com texto em vez da imagem.

  • Transmita assinaturas de pensamento:ao usar o Gemini 3 Pro Image, recomendamos que você transmita assinaturas de pensamento de volta ao modelo durante a criação e edição de imagens em várias etapas. Isso permite preservar o contexto de raciocínio em todas as interações. Para exemplos de código relacionados à edição de imagens em várias etapas usando o Gemini 3 Pro Image, consulte Exemplo de edição de imagens em várias etapas usando assinaturas de pensamento.

Limitações:

  • Para ter o melhor desempenho com a imagem do Gemini 2.5 Flash, use os seguintes idiomas: EN, es-MX, ja-JP, zh-CN ou hi-IN. Para ter o melhor desempenho com o Gemini 3 Pro Image, use os seguintes idiomas: 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 e zh-CN.

  • A geração de imagens não aceita entradas de áudio ou vídeo.

  • O modelo pode não criar o número exato de imagens que você pediu.

  • Para ter os melhores resultados com o Gemini 2.5 Flash Image, inclua no máximo três imagens em uma entrada. Para ter os melhores resultados com o Gemini 3 Pro Image, inclua no máximo 14 imagens em uma entrada.

  • Ao gerar uma imagem com texto, primeiro gere o texto e depois gere uma imagem com esse texto.

  • A geração de imagens ou texto pode não funcionar como esperado nestas situações:

    • O modelo só vai criar texto e não imagens se o comando for ambíguo. Se você quiser imagens, peça isso de forma clara. Por exemplo, "forneça imagens à medida que avança".

    • O modelo pode criar texto como uma imagem. Para gerar texto, peça especificamente uma saída de texto. Por exemplo, "gere texto narrativo com ilustrações".

    • O modelo pode parar de gerar conteúdo mesmo quando não tiver terminado. Se isso acontecer, tente de novo ou use outro comando.

    • Se um comando for potencialmente não seguro, o modelo poderá não processar a solicitação e vai retornar uma resposta indicando que não é possível criar imagens não seguras. Nesse caso, o FinishReason é STOP.

Gerar imagens

As seções a seguir mostram como gerar imagens usando o Vertex AI Studio ou a API.

Para orientações e práticas recomendadas sobre comandos, consulte Criar comandos multimodais.

Console

Para usar a geração de imagens:

  1. Abra Vertex AI Studio > Criar comando.
  2. Clique em Trocar modelo e selecione uma das seguintes opções no menu:
    • gemini-2.5-flash-image
    • gemini-3-pro-image-preview
  3. No painel Saídas, selecione Imagem e texto no menu suspenso.
  4. Escreva uma descrição da imagem que você quer gerar na área de texto Escreva um comando.
  5. Clique no botão Comando ().

O Gemini vai gerar uma imagem com base na sua descrição. Esse processo leva alguns segundos, mas pode ser comparativamente mais lento dependendo da capacidade.

Python

Instalar

pip install --upgrade google-genai

Para saber mais, consulte a documentação de referência do SDK.

Defina variáveis de ambiente para usar o SDK de IA generativa com a 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

Instalar

npm install @google/genai

Para saber mais, consulte a documentação de referência do SDK.

Defina variáveis de ambiente para usar o SDK de IA generativa com a 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

Saiba como instalar ou atualizar o Java.

Para saber mais, consulte a documentação de referência do SDK.

Defina variáveis de ambiente para usar o SDK de IA generativa com a 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

Execute o comando a seguir no terminal para criar ou substituir esse arquivo no diretório atual:

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

O Gemini vai gerar uma imagem com base na sua descrição. Esse processo leva alguns segundos, mas pode ser comparativamente mais lento dependendo da capacidade.

Gerar resposta com textos e imagens

O Gemini 2.5 Flash Image pode gerar imagens intercaladas com as respostas de texto. Por exemplo, você pode gerar imagens de como cada etapa de uma receita gerada pode ser para acompanhar o texto dessa etapa, sem precisar fazer solicitações separadas ao modelo para isso.

Console

Para gerar imagens intercaladas com respostas de texto:

  1. Abra Vertex AI Studio > Criar comando.
  2. Clique em Trocar modelo e selecione uma das seguintes opções no menu:
    • gemini-2.5-flash-image
    • gemini-3-pro-image-preview
  3. No painel Saídas, selecione Imagem e texto no menu suspenso.
  4. Escreva uma descrição da imagem que você quer gerar na área de texto Escreva um comando. Por exemplo, "Crie um tutorial explicando como fazer um sanduíche de pasta de amendoim e geleia em três etapas simples. Para cada etapa, forneça um título com o número da etapa, uma explicação e também gere uma imagem, cada uma em uma proporção de 1:1."
  5. Clique no botão Comando ().

O Gemini vai gerar uma resposta com base na sua descrição. Esse processo leva alguns segundos, mas pode ser comparativamente mais lento dependendo da capacidade.

Python

Instalar

pip install --upgrade google-genai

Para saber mais, consulte a documentação de referência do SDK.

Defina variáveis de ambiente para usar o SDK de IA generativa com a 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

Saiba como instalar ou atualizar o Java.

Para saber mais, consulte a documentação de referência do SDK.

Defina variáveis de ambiente para usar o SDK de IA generativa com a 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

Execute o comando a seguir no terminal para criar ou substituir esse arquivo no diretório atual:

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

O Gemini vai gerar uma imagem com base na sua descrição. Esse processo leva alguns segundos, mas pode ser comparativamente mais lento dependendo da capacidade.

Editar imagens

O Gemini 2.5 Flash Image para geração de imagens (gemini-2.5-flash-image) permite editar e gerar imagens. O Gemini 2.5 Flash Image oferece suporte a edição aprimorada de imagens e edição em várias etapas, além de filtros de segurança atualizados que proporcionam uma experiência do usuário mais flexível e menos restritiva.

Ele é compatível com as seguintes modalidades e recursos:

  • Edição de imagens (texto e imagem para imagem)

    • Comando de exemplo: "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árias interações (chat)

    • Exemplos de comandos: [faça upload de uma imagem de um carro azul.] "Transforme este carro em um conversível."

      • [O modelo retorna uma imagem de um carro conversível na mesma cena] "Agora mude a cor para amarelo".
      • [O modelo retorna uma imagem com um conversível amarelo] "Adicione um spoiler".
      • [O modelo retorna uma imagem do conversível com um spoiler]

Editar uma imagem

Console

Para editar imagens:

  1. Abra Vertex AI Studio > Criar comando.
  2. Clique em Trocar modelo e selecione uma das seguintes opções no menu:
    • gemini-2.5-flash-image
    • gemini-3-pro-image-preview
  3. No painel Saídas, selecione Imagem e texto no menu suspenso.
  4. Clique em Inserir mídia () e selecione uma origem no menu. Depois, siga as instruções da caixa de diálogo.
  5. Escreva as edições que você quer fazer na imagem na área de texto Escreva um comando.
  6. Clique no botão Comando ().

O Gemini vai gerar uma versão editada da imagem fornecida com base na sua descrição. Esse processo leva alguns segundos, mas pode ser comparativamente mais lento dependendo da capacidade.

Python

Instalar

pip install --upgrade google-genai

Para saber mais, consulte a documentação de referência do SDK.

Defina variáveis de ambiente para usar o SDK de IA generativa com a 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

Saiba como instalar ou atualizar o Java.

Para saber mais, consulte a documentação de referência do SDK.

Defina variáveis de ambiente para usar o SDK de IA generativa com a 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

Execute o comando a seguir no terminal para criar ou substituir esse arquivo no diretório atual:

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

O Gemini vai gerar uma imagem com base na sua descrição. Esse processo leva alguns segundos, mas pode ser comparativamente mais lento dependendo da capacidade.

Edição de imagens em várias etapas

O Gemini 2.5 Flash Image e o Gemini 3 Pro Image oferecem suporte à edição em várias etapas aprimorada, permitindo que você responda ao modelo com mudanças depois de receber uma resposta de imagem editada. Isso permite que você continue fazendo edições na imagem de forma conversacional.

Recomendamos limitar o tamanho total do arquivo de solicitação a 50 MB.

Para testar a edição de imagens em várias etapas, confira os seguintes notebooks:

Para exemplos de código relacionados à criação e edição de imagens em várias etapas usando o Gemini 3 Pro Image, consulte Exemplo de edição de imagens em várias etapas usando assinaturas de pensamento.

IA responsável

Para garantir uma experiência segura e responsável, os recursos de geração de imagens da Vertex AI são equipados com uma abordagem de segurança em várias camadas. Isso foi projetado para evitar a criação de conteúdo inadequado, incluindo material sexualmente explícito, perigoso, violento, ofensivo ou tóxico.

Todos os usuários precisam obedecer à Política de uso proibido da IA generativa. Essa política proíbe estritamente a geração de conteúdo que:

  • Esteja relacionado a abuso ou exploração sexual infantil.
  • Facilite o extremismo violento ou o terrorismo.
  • Facilite imagens íntimas não consensuais. Facilite a automutilação.
  • seja sexualmente explícito.
  • Constitua discurso de ódio.
  • Promove assédio ou bullying.

Quando recebe um comando não seguro, o modelo pode se recusar a gerar uma imagem, ou o comando ou a resposta gerada podem ser bloqueados pelos nossos filtros de segurança.

  • Recusa do modelo: se um comando for potencialmente não seguro, o modelo poderá se recusar a processar a solicitação. Se isso acontecer, o modelo geralmente vai dar uma resposta em texto dizendo que não pode gerar imagens não seguras. O FinishReason será STOP.
  • Bloqueio do filtro de segurança:
    • Se o comando for identificado como potencialmente prejudicial por um filtro de segurança, a API vai retornar BlockedReason em PromptFeedback.
    • Se a resposta for identificada como potencialmente prejudicial por um filtro de segurança, a resposta da API vai incluir um FinishReason de IMAGE_SAFETY, IMAGE_PROHIBITED_CONTENT ou semelhante.

Categorias de código de filtro de segurança

Dependendo dos filtros de segurança configurados, a saída pode conter um código de motivo semelhante ao seguinte:

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

O código listado corresponde a uma categoria nociva específica. Esses códigos para os mapeamentos de categoria são os seguintes:

Código do erro Categoria de segurança Descrição Conteúdo filtrado: entrada de comando ou saída de imagem
58061214
17301594
Filho Detecta conteúdo infantil onde ele não é permitido devido às configurações de solicitação da API ou à lista de permissões. input (prompt): 58061214
output (imagem): 17301594
29310472
15236754
Celebridade Detecta uma representação fotorrealista de uma celebridade na solicitação. input (prompt): 29310472
output (imagem): 15236754
62263041 Conteúdo perigoso Detecta conteúdo que é potencialmente perigoso por natureza. Entrada (prompt)
57734940
22137204
Incita o ódio Detecta conteúdo ou tópicos relacionados a incitação ao ódio. entrada (comando): 57734940
saída (imagem): 22137204
74803281
29578790
42876398
Outro Detecta outros problemas de segurança diversos com a solicitação. entrada (comando): 42876398
saída (imagem): 29578790, 74803281
39322892 Pessoas/Rosto Detecta uma pessoa ou um rosto quando isso não é permitido devido às configurações de segurança da solicitação. saída (imagem)
92201652 Informações pessoais Detecta informações de identificação pessoal (PII) no texto, como a menção de um número de cartão de crédito, endereços residenciais ou outras informações. Entrada (prompt)
89371032
49114662
72817394
Conteúdo proibido Detecta a solicitação de conteúdo proibido. input (prompt): 89371032
output (imagem): 49114662, 72817394
90789179
63429089
43188360
Conteúdo sexual Detecta conteúdo de natureza sexual. input (comando): 90789179
output (imagem): 63429089, 43188360
78610348 Tóxico Detecta temas ou conteúdo tóxico no texto. Entrada (prompt)
61493863
56562880
Violência Detecta conteúdo relacionado à violência na imagem ou no texto. input (comando): 61493863
output (imagem): 56562880
32635315 Vulgar Detecta temas ou conteúdo vulgar no texto. Entrada (prompt)
64151117 Celebridade ou criança Detecta representações fotorrealistas de uma celebridade ou de uma criança que violam as políticas de segurança do Google. entrada (comando)
saída (imagem)