Membuat dan mengedit gambar dengan Gemini

Model Gemini berikut mendukung kemampuan untuk membuat gambar selain teks:

  • Gemini 2.5 Flash Image, atau dikenal juga sebagai Gemini 2.5 Flash (dengan Nano Banana)

  • Gemini 3 Pro Image (pratinjau), atau dikenal juga sebagai Gemini 3 Pro (dengan Nano Banana)

Hal ini memperluas kemampuan Gemini untuk mencakup hal berikut:

  • Buat gambar secara iteratif melalui percakapan dengan bahasa alami, sesuaikan gambar sambil mempertahankan konsistensi dan konteks.
  • Buat gambar dengan rendering teks panjang berkualitas tinggi.
  • Menghasilkan output teks-gambar yang disisipkan. Misalnya, postingan blog dengan teks dan gambar dalam satu giliran. Sebelumnya, hal ini memerlukan penggabungan beberapa model.
  • Membuat gambar menggunakan kemampuan penalaran dan pengetahuan dunia Gemini.

Pratinjau Gemini 2.5 Flash Image (gemini-2.5-flash-image) dan Gemini 3 Pro Image (gemini-3-pro-image-preview) mendukung pembuatan gambar orang dan berisi filter keamanan yang diperbarui yang memberikan pengalaman pengguna yang lebih fleksibel dan tidak terlalu ketat. Gemini 2.5 Flash Image dapat membuat gambar dalam ukuran 1024 px. Gambar Gemini 3 Pro dapat membuat gambar hingga 4096 px.

Kedua model mendukung modalitas dan kemampuan berikut:

  • Teks ke gambar

    • Contoh perintah: "Buat gambar Menara Eiffel dengan kembang api di latar belakang."
  • Teks ke gambar (rendering teks)

    • Contoh perintah: "buat foto sinematik sebuah bangunan besar dengan proyeksi teks raksasa ini yang dipetakan di bagian depan bangunan: "Gemini 3 kini dapat membuat teks panjang""
  • Teks ke gambar dan teks (diselingi)

    • Contoh perintah: "Buat resep paella bergambar. Buat gambar bersama teks saat Anda membuat resep."
    • Contoh perintah: "Buat cerita tentang seekor dengan gaya animasi kartun 3D. Untuk setiap adegan, buat gambar"
  • Gambar dan teks ke gambar dan teks (berselang)

    • Contoh perintah: (Dengan gambar ruangan yang dilengkapi perabot) "Sofa warna apa lagi yang cocok untuk ruangan saya? Dapatkah Anda memperbarui gambar?"

Praktik terbaik

Untuk meningkatkan hasil pembuatan gambar Anda, ikuti praktik terbaik berikut:

  • Bersikap spesifik: Semakin banyak detail yang Anda berikan, semakin besar kontrol yang Anda miliki. Misalnya, alih-alih "armor fantasi", coba "armor pelat elf yang indah, diukir dengan pola daun perak, dengan kerah tinggi dan pauldron berbentuk sayap elang".

  • Berikan konteks dan maksud: Jelaskan tujuan gambar untuk membantu model memahami konteksnya. Misalnya, "Buat logo untuk merek perawatan kulit minimalis kelas atas" lebih efektif daripada "Buat logo".

  • Lakukan iterasi dan penyempurnaan: Jangan mengharapkan gambar yang sempurna pada percobaan pertama. Gunakan perintah lanjutan untuk membuat perubahan kecil, misalnya, "Buat pencahayaannya lebih hangat" atau "Ubah ekspresi karakter agar lebih serius".

  • Gunakan petunjuk langkah demi langkah: Untuk adegan yang rumit, bagi permintaan Anda menjadi beberapa langkah. Misalnya, "Pertama, buat latar belakang hutan berkabut yang tenang saat fajar. Kemudian, di latar depan, tambahkan altar batu kuno yang tertutup lumut. Terakhir, letakkan pedang tunggal yang bercahaya di atas altar."

  • Deskripsikan apa yang Anda inginkan, bukan yang tidak Anda inginkan: Daripada mengatakan "tidak ada mobil", deskripsikan adegan secara positif dengan mengatakan, "jalan yang kosong dan sepi tanpa tanda-tanda lalu lintas".

  • Mengontrol kamera: Memandu tampilan kamera. Gunakan istilah fotografi dan sinematik untuk mendeskripsikan komposisi, misalnya, "gambar sudut lebar", "gambar makro", atau "perspektif sudut rendah".

  • Perintah untuk gambar: Jelaskan maksudnya dengan menggunakan frasa seperti "buat gambar" atau "buatkan gambar". Jika tidak, model multimodal dapat merespons dengan teks, bukan gambar.

  • Meneruskan Tanda Tangan Pemikiran: Saat menggunakan Gemini 3 Pro Image, sebaiknya Anda meneruskan tanda tangan pemikiran kembali ke model selama pembuatan dan pengeditan gambar multi-turn. Dengan begitu, Anda dapat mempertahankan konteks penalaran di seluruh interaksi. Untuk contoh kode terkait pengeditan gambar multi-turn menggunakan Gemini 3 Pro Image, lihat Contoh pengeditan gambar multi-turn menggunakan tanda tangan pemikiran.

Batasan:

  • Untuk performa terbaik dengan Gemini 2.5 Flash Image, gunakan bahasa berikut: Inggris, Spanyol (Meksiko), Jepang, China (China), atau Hindi (India). Untuk performa terbaik dengan Gambar Gemini 3 Pro, gunakan bahasa berikut: 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, dan zh-CN

  • Pembuatan gambar tidak mendukung input audio atau video.

  • Model mungkin tidak membuat jumlah gambar yang tepat seperti yang Anda minta.

  • Untuk hasil terbaik saat menggunakan Gemini 2.5 Flash Image, sertakan maksimal tiga gambar dalam input. Untuk hasil terbaik menggunakan Gemini 3 Pro Image, sertakan maksimal 14 gambar dalam input.

  • Saat membuat gambar yang berisi teks, buat teks terlebih dahulu, lalu buat gambar dengan teks tersebut.

  • Pembuatan gambar atau teks mungkin tidak berfungsi seperti yang diharapkan dalam situasi berikut:

    • Model hanya dapat membuat teks dan tidak membuat gambar jika perintahnya ambigu. Jika Anda menginginkan gambar, minta gambar dengan jelas dalam permintaan Anda. Misalnya, "berikan gambar saat Anda melakukannya".

    • Model dapat membuat teks sebagai gambar. Untuk membuat teks, khususnya minta output teks. Misalnya, "buat teks naratif beserta ilustrasinya".

    • Model dapat berhenti membuat konten meskipun belum selesai. Jika hal ini terjadi, coba lagi atau gunakan perintah yang berbeda.

    • Jika perintah berpotensi tidak aman, model mungkin tidak memproses permintaan dan menampilkan respons yang menunjukkan bahwa model tidak dapat membuat gambar yang tidak aman. Dalam hal ini, nilai FinishReason adalah STOP.

Buat gambar

Bagian berikut membahas cara membuat gambar menggunakan Vertex AI Studio atau menggunakan API.

Untuk panduan dan praktik terbaik dalam membuat perintah, lihat Mendesain perintah multimodal.

Konsol

Untuk menggunakan pembuatan gambar:

  1. Buka Vertex AI Studio > Create prompt.
  2. Klik Ganti model dan pilih salah satu model berikut dari menu:
    • gemini-2.5-flash-image
    • gemini-3-pro-image-preview
  3. Di panel Output, pilih Gambar dan teks dari menu drop-down.
  4. Tulis deskripsi gambar yang ingin Anda buat di area teks Tulis perintah.
  5. Klik tombol Perintah ().

Gemini akan membuat gambar berdasarkan deskripsi Anda. Proses ini memerlukan waktu beberapa detik, tetapi dapat lebih lambat bergantung pada kapasitasnya.

Python

Instal

pip install --upgrade google-genai

Untuk mempelajari lebih lanjut, lihat dokumentasi referensi SDK.

Tetapkan variabel lingkungan untuk menggunakan Gen AI SDK dengan 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

Instal

npm install @google/genai

Untuk mempelajari lebih lanjut, lihat dokumentasi referensi SDK.

Tetapkan variabel lingkungan untuk menggunakan Gen AI SDK dengan 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

Pelajari cara menginstal atau mengupdate Java.

Untuk mempelajari lebih lanjut, lihat dokumentasi referensi SDK.

Tetapkan variabel lingkungan untuk menggunakan Gen AI SDK dengan 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

Jalankan perintah berikut di terminal untuk membuat atau menimpa file ini di direktori saat ini:

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 akan membuat gambar berdasarkan deskripsi Anda. Proses ini memerlukan waktu beberapa detik, tetapi dapat lebih lambat bergantung pada kapasitasnya.

Membuat kombinasi gambar dan teks

Gemini 2.5 Flash Image dapat membuat gambar yang disisipkan dengan respons teksnya. Misalnya, Anda dapat membuat gambar yang menunjukkan tampilan setiap langkah resep yang dibuat untuk melengkapi teks langkah tersebut, tanpa harus membuat permintaan terpisah ke model untuk melakukannya.

Konsol

Untuk membuat kombinasi gambar dengan respons teks:

  1. Buka Vertex AI Studio > Create prompt.
  2. Klik Ganti model dan pilih salah satu model berikut dari menu:
    • gemini-2.5-flash-image
    • gemini-3-pro-image-preview
  3. Di panel Output, pilih Gambar dan teks dari menu drop-down.
  4. Tulis deskripsi gambar yang ingin Anda buat di area teks Tulis perintah. Misalnya, "Buat tutorial yang menjelaskan cara membuat sandwich selai kacang dan jeli dalam tiga langkah mudah. Untuk setiap langkah, berikan judul dengan nomor langkah, penjelasan, dan buat juga gambar, buat setiap gambar dalam rasio aspek 1:1."
  5. Klik tombol Perintah ().

Gemini akan membuat respons berdasarkan deskripsi Anda. Proses ini memerlukan waktu beberapa detik, tetapi dapat lebih lambat bergantung pada kapasitasnya.

Python

Instal

pip install --upgrade google-genai

Untuk mempelajari lebih lanjut, lihat dokumentasi referensi SDK.

Tetapkan variabel lingkungan untuk menggunakan Gen AI SDK dengan 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

Pelajari cara menginstal atau mengupdate Java.

Untuk mempelajari lebih lanjut, lihat dokumentasi referensi SDK.

Tetapkan variabel lingkungan untuk menggunakan Gen AI SDK dengan 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

Jalankan perintah berikut di terminal untuk membuat atau menimpa file ini di direktori saat ini:

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 akan membuat gambar berdasarkan deskripsi Anda. Proses ini memerlukan waktu beberapa detik, tetapi dapat lebih lambat bergantung pada kapasitasnya.

Mengedit gambar

Gemini 2.5 Flash Image untuk pembuatan gambar (gemini-2.5-flash-image) mendukung kemampuan untuk mengedit gambar selain membuatnya. Gemini 2.5 Flash Image mendukung pengeditan gambar yang lebih baik dan pengeditan multi-turn, serta berisi filter keamanan yang diperbarui yang memberikan pengalaman pengguna yang lebih fleksibel dan tidak terlalu ketat.

API ini mendukung modalitas dan kemampuan berikut:

  • Pengeditan gambar (teks dan gambar ke gambar)

    • Contoh perintah: "Edit gambar ini agar terlihat seperti kartun"
    • Contoh perintah: [gambar kucing] + [gambar bantal] + "Buat sulaman silang kucing saya di bantal ini."
  • Pengeditan gambar multi-turn (chat)

    • Contoh perintah: [upload gambar mobil biru.] "Ubah mobil ini menjadi mobil convertible."

      • [Model menampilkan gambar mobil convertible di adegan yang sama] "Sekarang ubah warnanya menjadi kuning."
      • [Model menampilkan gambar mobil convertible kuning] "Tambahkan spoiler."
      • [Model menampilkan gambar mobil convertible dengan spoiler]

Mengedit gambar

Konsol

Untuk mengedit gambar:

  1. Buka Vertex AI Studio > Create prompt.
  2. Klik Ganti model dan pilih salah satu model berikut dari menu:
    • gemini-2.5-flash-image
    • gemini-3-pro-image-preview
  3. Di panel Output, pilih Gambar dan teks dari menu drop-down.
  4. Klik Sisipkan media () dan pilih sumber dari menu, lalu ikuti petunjuk dialog.
  5. Tulis pengeditan yang ingin Anda lakukan pada gambar di area teks Tulis perintah.
  6. Klik tombol Perintah ().

Gemini akan membuat versi yang diedit dari gambar yang diberikan berdasarkan deskripsi Anda. Proses ini memerlukan waktu beberapa detik, tetapi dapat lebih lambat bergantung pada kapasitasnya.

Python

Instal

pip install --upgrade google-genai

Untuk mempelajari lebih lanjut, lihat dokumentasi referensi SDK.

Tetapkan variabel lingkungan untuk menggunakan Gen AI SDK dengan 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

Pelajari cara menginstal atau mengupdate Java.

Untuk mempelajari lebih lanjut, lihat dokumentasi referensi SDK.

Tetapkan variabel lingkungan untuk menggunakan Gen AI SDK dengan 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

Jalankan perintah berikut di terminal untuk membuat atau menimpa file ini di direktori saat ini:

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 akan membuat gambar berdasarkan deskripsi Anda. Proses ini memerlukan waktu beberapa detik, tetapi dapat lebih lambat bergantung pada kapasitasnya.

Pengeditan gambar multi-turn

Gemini 2.5 Flash Image dan Gemini 3 Pro Image mendukung pengeditan multi-turn yang ditingkatkan, sehingga Anda dapat merespons model dengan perubahan setelah menerima respons gambar yang diedit. Dengan begitu, Anda dapat terus mengedit gambar melalui percakapan.

Perhatikan bahwa sebaiknya batasi ukuran file permintaan secara keseluruhan hingga maksimum 50 MB.

Untuk menguji pengeditan gambar multi-turn, coba notebook berikut:

Untuk contoh kode terkait pembuatan dan pengeditan gambar multi-turn menggunakan Gemini 3 Pro Image, lihat Contoh pengeditan gambar multi-turn menggunakan tanda tangan pemikiran.

Responsible AI

Untuk memastikan pengalaman yang aman dan bertanggung jawab, kemampuan pembuatan gambar Vertex AI dilengkapi dengan pendekatan keamanan berlapis. Fitur ini dirancang untuk mencegah pembuatan konten yang tidak pantas, termasuk materi seksual vulgar, berbahaya, kekerasan, kebencian, atau beracun.

Semua pengguna harus mematuhi Kebijakan Penggunaan Terlarang untuk AI Generatif. Kebijakan ini secara ketat melarang pembuatan konten yang:

  • Berkaitan dengan eksploitasi atau pelecehan seksual terhadap anak-anak.
  • Memfasilitasi terorisme atau ekstremisme kekerasan.
  • Memfasilitasi penggambaran adegan intim non-konsensual. Memfasilitasi tindakan menyakiti diri sendiri.
  • Berisi konten seksual vulgar.
  • Merupakan ujaran kebencian.
  • Mendukung pelecehan atau penindasan.

Saat diberi perintah yang tidak aman, model mungkin menolak untuk membuat gambar, atau perintah atau respons yang dihasilkan mungkin diblokir oleh filter keamanan kami.

  • Penolakan model: Jika perintah berpotensi tidak aman, model mungkin menolak untuk memproses permintaan. Jika hal ini terjadi, model biasanya memberikan respons teks yang menyatakan bahwa model tidak dapat membuat gambar yang tidak aman. FinishReason akan menjadi STOP.
  • Pemblokiran filter keamanan:
    • Jika perintah diidentifikasi sebagai berpotensi berbahaya oleh filter keamanan, API akan menampilkan BlockedReason di PromptFeedback.
    • Jika respons diidentifikasi sebagai berpotensi berbahaya oleh filter keamanan, respons API akan menyertakan FinishReason IMAGE_SAFETY, IMAGE_PROHIBITED_CONTENT, atau yang serupa.

Kategori kode filter keamanan

Bergantung pada filter keamanan yang Anda konfigurasi, output Anda mungkin berisi kode alasan keamanan yang mirip dengan berikut ini:

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

Kode yang tercantum sesuai dengan kategori berbahaya tertentu. Pemetaan kode ke kategori ini adalah sebagai berikut:

Kode error Kategori keamanan Deskripsi Konten yang difilter: input perintah atau output gambar
58061214
17301594
Anak Mendeteksi konten anak yang tidak diizinkan karena setelan permintaan API atau daftar yang diizinkan. input (perintah): 58061214
output (gambar): 17301594
29310472
15236754
Selebritas Mendeteksi representasi fotorealistik selebritas dalam permintaan. input (perintah): 29310472
output (gambar): 15236754
62263041 Konten berbahaya Mendeteksi konten yang berpotensi berbahaya. input (perintah)
57734940
22137204
Kebencian Mendeteksi topik atau konten terkait kebencian. input (perintah): 57734940
output (gambar): 22137204
74803281
29578790
42876398
Lainnya Mendeteksi masalah keamanan lain-lain dengan permintaan. input (perintah): 42876398
output (gambar): 29578790, 74803281
39322892 Orang/Wajah Mendeteksi orang atau wajah saat tidak diizinkan karena setelan keamanan permintaan. output (gambar)
92201652 Informasi pribadi Mendeteksi Informasi Identitas Pribadi (PII) dalam teks, seperti penyebutan nomor kartu kredit, alamat rumah, atau informasi serupa lainnya. input (perintah)
89371032
49114662
72817394
Konten terlarang Mendeteksi permintaan konten terlarang dalam permintaan. input (perintah): 89371032
output (gambar): 49114662, 72817394
90789179
63429089
43188360
Sexual Mendeteksi konten yang bersifat seksual. input (perintah): 90789179
output (gambar): 63429089, 43188360
78610348 Toxic Mendeteksi topik atau konten berbahaya dalam teks. input (perintah)
61493863
56562880
Kekerasan Mendeteksi konten terkait kekerasan dari gambar atau teks. input (perintah): 61493863
output (gambar): 56562880
32635315 Vulgar Mendeteksi topik atau konten vulgar dari teks. input (perintah)
64151117 Selebritas atau anak Mendeteksi representasi fotorealistik selebritas atau anak yang melanggar kebijakan keselamatan Google. input (perintah)
output (gambar)