Generar y editar imágenes con Gemini

Los siguientes modelos de Gemini admiten la capacidad de generar imágenes, además de texto:

  • Gemini 2.5 Flash Image, también conocido como Gemini 2.5 Flash (con Nano Banana)

  • Gemini 3 Pro Image (versión preliminar), también conocido como Gemini 3 Pro (con Nano Banana)

Esto amplía las funciones de Gemini para incluir lo siguiente:

  • Genera imágenes de forma iterativa mediante conversaciones con lenguaje natural y ajusta las imágenes manteniendo la coherencia y el contexto.
  • Genera imágenes con renderización de texto largo de alta calidad.
  • Genera una salida de texto e imagen intercalada. Por ejemplo, una entrada de blog con texto e imágenes en una sola petición. Antes, esto requería encadenar varios modelos.
  • Genera imágenes usando el conocimiento del mundo y las capacidades de razonamiento de Gemini.

Gemini 2.5 Flash Image (gemini-2.5-flash-image) y Gemini 3 Pro Image (gemini-3-pro-image-preview) admiten la generación de imágenes de personas y contienen filtros de seguridad actualizados que ofrecen una experiencia de usuario más flexible y menos restrictiva. Gemini 2.5 Flash Image puede generar imágenes de 1024 px. Gemini 3 Pro Image puede generar imágenes de hasta 4096 px.

Ambos modelos admiten las siguientes modalidades y funciones:

  • Texto a imagen

    • Petición de ejemplo: "Genera una imagen de la Torre Eiffel con fuegos artificiales de fondo".
  • Texto a imagen (renderización de texto)

    • Petición de ejemplo: "genera una foto cinematográfica de un edificio grande con esta proyección de texto gigante en la fachada: "Gemini 3 ahora puede generar textos largos""
  • Texto a imagen(es) y texto (intercalado)

    • Petición de ejemplo: "Genera una receta ilustrada de paella. Crea imágenes junto al texto a medida que generas la receta".
    • Petición de ejemplo: "Genera una historia sobre un perro con un estilo de animación de dibujos animados en 3D. Genera una imagen para cada escena"
  • Imágenes y texto a imágenes y texto (intercalados)

    • Petición de ejemplo: (Con una imagen de una habitación amueblada) "¿Qué otros colores de sofá quedarían bien en mi espacio? ¿Puedes actualizar la imagen?"

Prácticas recomendadas

Para mejorar los resultados de generación de imágenes, siga estas prácticas recomendadas:

  • Especifica: cuantos más detalles proporciones, más control tendrás. Por ejemplo, en lugar de "armadura de fantasía", prueba con "armadura de placas élfica ornamentada, grabada con patrones de hojas de plata, con un cuello alto y hombreras con forma de alas de halcón".

  • Proporciona contexto e intención: explica el propósito de la imagen para ayudar al modelo a entender el contexto. Por ejemplo, "Crea un logotipo para una marca de cosméticos minimalista de alta gama" funciona mejor que "Crea un logotipo".

  • Repetir y perfeccionar: no esperes obtener una imagen perfecta en el primer intento. Usa peticiones de seguimiento para hacer pequeños cambios, como "Haz que la iluminación sea más cálida" o "Cambia la expresión del personaje para que sea más seria".

  • Usa instrucciones detalladas: si las escenas son complejas, divide tu petición en pasos. Por ejemplo, "Primero, crea un fondo de un bosque sereno y brumoso al amanecer. A continuación, añade en primer plano un antiguo altar de piedra cubierto de musgo. Por último, coloca una espada brillante sobre el altar".

  • Describe lo que quieres, no lo que no quieres: en lugar de decir "sin coches", describe la escena de forma positiva diciendo "una calle vacía y desierta sin señales de tráfico".

  • Controlar la cámara: guía la vista de la cámara. Usa términos fotográficos y cinematográficos para describir la composición, como "plano general", "macro" o "plano desde abajo".

  • Peticiones de imágenes: describe la intención con frases como "crea una imagen de" o "genera una imagen de". De lo contrario, el modelo multimodal podría responder con texto en lugar de con la imagen.

  • Pasa Firmas de pensamientos: Cuando uses Gemini 3 Pro Image, te recomendamos que pases firmas de pensamientos al modelo durante la creación y edición de imágenes en varias interacciones. De esta forma, puedes conservar el contexto de razonamiento en las interacciones. Para ver ejemplos de código relacionados con la edición de imágenes en varias fases con Gemini 3 Pro Image, consulta Ejemplo de edición de imágenes en varias fases con firmas de pensamiento.

Limitaciones:

  • Para obtener el mejor rendimiento con Gemini 2.5 Flash Image, usa los siguientes idiomas: inglés, español (México), japonés, chino (China) o hindi (India). Para obtener el mejor rendimiento con Gemini 3 Pro Image, usa los siguientes 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 y zh-CN.

  • La generación de imágenes no admite entradas de audio ni de vídeo.

  • Es posible que el modelo no cree el número exacto de imágenes que le pidas.

  • Para obtener los mejores resultados con Gemini 2.5 Flash Image, incluye un máximo de tres imágenes en una entrada. Para obtener los mejores resultados con Gemini 3 Pro Image, incluye un máximo de 14 imágenes en una entrada.

  • Cuando generes una imagen que contenga texto, primero genera el texto y, después, genera una imagen con ese texto.

  • Es posible que la generación de imágenes o texto no funcione como se espera en estas situaciones:

    • Es posible que el modelo solo cree texto y no genere ninguna imagen si la petición es ambigua. Si quieres imágenes, pídelas claramente en tu solicitud. Por ejemplo, "proporciona imágenes a medida que avanzas".

    • El modelo podría crear texto como una imagen. Para generar texto, pide específicamente que se muestre texto. Por ejemplo, "genera texto narrativo junto con ilustraciones".

    • Es posible que el modelo deje de generar contenido aunque no haya terminado. Si esto ocurre, vuelve a intentarlo o usa otra petición.

    • Si una petición es potencialmente peligrosa, es posible que el modelo no la procese y devuelva una respuesta que indique que no puede crear imágenes peligrosas. En este caso, el FinishReason es STOP.

Generar imágenes

En las siguientes secciones se explica cómo generar imágenes con Vertex AI Studio o con la API.

Para obtener directrices y prácticas recomendadas sobre cómo crear peticiones, consulta Diseñar peticiones multimodales.

Consola

Para usar la generación de imágenes, sigue estos pasos:

  1. Abre Vertex AI Studio > Crear petición.
  2. Haz clic en Cambiar modelo y selecciona uno de los siguientes modelos del menú:
    • gemini-2.5-flash-image
    • gemini-3-pro-image-preview
  3. En el panel Resultados, selecciona Imagen y texto en el menú desplegable.
  4. Escribe una descripción de la imagen que quieras generar en el área de texto Escribe una petición.
  5. Haz clic en el botón Petición ().

Gemini generará una imagen basada en tu descripción. Este proceso tarda unos segundos, pero puede ser comparativamente más lento en función de la capacidad.

Python

Instalar

pip install --upgrade google-genai

Para obtener más información, consulta la documentación de referencia del SDK.

Define variables de entorno para usar el SDK de IA generativa con 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 obtener más información, consulta la documentación de referencia del SDK.

Define variables de entorno para usar el SDK de IA generativa con 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

Consulta cómo instalar o actualizar Java.

Para obtener más información, consulta la documentación de referencia del SDK.

Define variables de entorno para usar el SDK de IA generativa con 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

Ejecuta el siguiente comando en el terminal para crear o sobrescribir este archivo en el directorio actual:

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 generará una imagen basada en tu descripción. Este proceso tarda unos segundos, pero puede ser relativamente más lento en función de la capacidad.

Generar imágenes y texto intercalados

Gemini 2.5 Flash Image puede generar imágenes intercaladas con sus respuestas de texto. Por ejemplo, puedes generar imágenes de cada paso de una receta generada para acompañar el texto de ese paso, sin tener que enviar solicitudes independientes al modelo para hacerlo.

Consola

Para generar imágenes intercaladas con respuestas de texto, sigue estos pasos:

  1. Abre Vertex AI Studio > Crear petición.
  2. Haz clic en Cambiar modelo y selecciona uno de los siguientes modelos del menú:
    • gemini-2.5-flash-image
    • gemini-3-pro-image-preview
  3. En el panel Resultados, selecciona Imagen y texto en el menú desplegable.
  4. Escribe una descripción de la imagen que quieras generar en el área de texto Escribe una petición. Por ejemplo, "Crea un tutorial en el que se explique cómo hacer un sándwich de mantequilla de cacahuete y mermelada en tres sencillos pasos. En cada paso, indica un título con el número del paso y una explicación. Además, genera una imagen con una relación de aspecto de 1:1".
  5. Haz clic en el botón Petición ().

Gemini generará una respuesta basada en tu descripción. Este proceso tarda unos segundos, pero puede ser relativamente más lento en función de la capacidad.

Python

Instalar

pip install --upgrade google-genai

Para obtener más información, consulta la documentación de referencia del SDK.

Define variables de entorno para usar el SDK de IA generativa con 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

Consulta cómo instalar o actualizar Java.

Para obtener más información, consulta la documentación de referencia del SDK.

Define variables de entorno para usar el SDK de IA generativa con 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

Ejecuta el siguiente comando en el terminal para crear o sobrescribir este archivo en el directorio actual:

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 generará una imagen basada en tu descripción. Este proceso tarda unos segundos, pero puede ser relativamente más lento en función de la capacidad.

Editar imágenes

Gemini 2.5 Flash Image para la generación de imágenes (gemini-2.5-flash-image) permite editar imágenes además de generarlas. Gemini 2.5 Flash Image admite una edición de imágenes mejorada y una edición de varias interacciones, y contiene filtros de seguridad actualizados que ofrecen una experiencia de usuario más flexible y menos restrictiva.

Admite las siguientes modalidades y funciones:

  • Edición de imágenes (texto e imagen a imagen)

    • Petición de ejemplo: "Edita esta imagen para que parezca un dibujo animado"
    • Petición de ejemplo: [imagen de un gato] + [imagen de una almohada] + "Crea un bordado de punto de cruz de mi gato en esta almohada".
  • Edición de imágenes en varias fases (conversación)

    • Ejemplos de peticiones: [sube una imagen de un coche azul]. "Convierte este coche en un descapotable".

      • [El modelo devuelve una imagen de un descapotable en la misma escena] "Ahora cambia el color a amarillo".
      • [El modelo devuelve una imagen de un coche descapotable amarillo] "Añade un alerón".
      • [El modelo devuelve una imagen del descapotable con un alerón]

Editar una imagen

Consola

Para editar imágenes, sigue estos pasos:

  1. Abre Vertex AI Studio > Crear petición.
  2. Haz clic en Cambiar modelo y selecciona uno de los siguientes modelos del menú:
    • gemini-2.5-flash-image
    • gemini-3-pro-image-preview
  3. En el panel Resultados, selecciona Imagen y texto en el menú desplegable.
  4. Haz clic en Insertar contenido multimedia () y selecciona una fuente en el menú. A continuación, sigue las instrucciones del cuadro de diálogo.
  5. Escribe los cambios que quieras hacer en la imagen en el área de texto Escribe una petición.
  6. Haz clic en el botón Petición ().

Gemini generará una versión editada de la imagen proporcionada basándose en tu descripción. Este proceso tarda unos segundos, pero puede ser relativamente más lento en función de la capacidad.

Python

Instalar

pip install --upgrade google-genai

Para obtener más información, consulta la documentación de referencia del SDK.

Define variables de entorno para usar el SDK de IA generativa con 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

Consulta cómo instalar o actualizar Java.

Para obtener más información, consulta la documentación de referencia del SDK.

Define variables de entorno para usar el SDK de IA generativa con 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

Ejecuta el siguiente comando en el terminal para crear o sobrescribir este archivo en el directorio actual:

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 generará una imagen basada en tu descripción. Este proceso tarda unos segundos, pero puede ser relativamente más lento en función de la capacidad.

Edición de imágenes en varias fases

Gemini 2.5 Flash Image y Gemini 3 Pro Image admiten la edición en varias fases mejorada, lo que te permite responder al modelo con cambios después de recibir una imagen editada. De esta forma, podrás seguir editando la imagen de forma conversacional.

Ten en cuenta que se recomienda limitar el tamaño total del archivo de solicitud a un máximo de 50 MB.

Para probar la edición de imágenes en varias fases, prueba los siguientes cuadernos:

Para ver ejemplos de código relacionados con la creación y edición de imágenes en varias interacciones con Gemini 3 Pro Image, consulta el ejemplo de edición de imágenes en varias interacciones con firmas de pensamiento.

Una IA responsable

Para ofrecer una experiencia segura y responsable, las funciones de generación de imágenes de Vertex AI se han diseñado con un enfoque de seguridad multicapa. Su objetivo es evitar la creación de contenido inapropiado, como material sexualmente explícito, peligroso, violento, tóxico o que incite al odio.

Todos los usuarios deben cumplir la Política de Usos Prohibidos de la IA Generativa. Esta política prohíbe estrictamente la generación de contenido que:

  • Esté relacionado con la explotación o el abuso sexual infantil.
  • Promueva el extremismo violento o el terrorismo.
  • Facilite imágenes íntimas no consentidas. Propicie las autolesiones.
  • Es sexualmente explícito.
  • Incitación al odio.
  • Promueve el acoso.

Si se le proporciona una petición no segura, es posible que el modelo se niegue a generar una imagen o que nuestros filtros de seguridad bloqueen la petición o la respuesta generada.

  • Rechazo del modelo: si una petición no es segura, el modelo puede negarse a procesarla. Si esto ocurre, el modelo suele dar una respuesta de texto diciendo que no puede generar imágenes no seguras. El FinishReason será STOP.
  • Bloqueo de filtros de seguridad:
    • Si un filtro de seguridad identifica que la petición es potencialmente dañina, la API devuelve BlockedReason en PromptFeedback.
    • Si un filtro de seguridad identifica la respuesta como potencialmente dañina, la respuesta de la API incluirá un FinishReason de IMAGE_SAFETY, IMAGE_PROHIBITED_CONTENT o similar.

Categorías de códigos de filtros de seguridad

En función de los filtros de seguridad que configures, tu salida puede contener un código de motivo de seguridad similar al siguiente:

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

El código indicado corresponde a una categoría dañina específica. Estas asignaciones de código a categoría son las siguientes:

Código de error Categoría de seguridad Descripción Contenido filtrado: petición o imagen
58061214
17301594
Hijo/a Detecta contenido infantil en los casos en los que no está permitido debido a los ajustes de la solicitud de la API o a la lista de permitidos. Entrada (petición): 58061214
Salida (imagen): 17301594
29310472
15236754
Celebrity Detecta una representación fotorrealista de un famoso en la solicitud. Entrada (petición): 29310472
Salida (imagen): 15236754
62263041 Contenido peligroso Detecta contenido que puede ser peligroso. Entrada (petición)
57734940
22137204
Odio Detecta temas o contenido relacionados con el odio. Entrada (petición): 57734940
Salida (imagen): 22137204
74803281
29578790
42876398
Otro Detecta otros problemas de seguridad varios en la solicitud. Entrada (petición): 42876398
Salida (imagen): 29578790, 74803281
39322892 Personas/Cara Detecta a una persona o una cara cuando no está permitido debido a los ajustes de seguridad de la solicitud. output (image)
92201652 Información personal Detecta información personal identificable (IPI) en el texto, como números de tarjetas de crédito, direcciones de casa u otra información similar. Entrada (petición)
89371032
49114662
72817394
Contenido prohibido Detecta la solicitud de contenido prohibido en la solicitud. Entrada (petición): 89371032
Salida (imagen): 49114662, 72817394
90789179
63429089
43188360
Sexual Detecta contenido de carácter sexual. Entrada (petición): 90789179
Salida (imagen): 63429089, 43188360
78610348 Tóxico Detecta temas o contenido tóxicos en el texto. Entrada (petición)
61493863
56562880
Violencia Detecta contenido relacionado con la violencia en la imagen o el texto. Entrada (petición): 61493863
Salida (imagen): 56562880
32635315 Vulgar Detecta temas o contenido vulgares en el texto. Entrada (petición)
64151117 Famoso o niño Detecta representaciones fotorrealistas de famosos o niños que infringen las políticas de seguridad de Google. entrada (petición)
salida (imagen)