Tạo hình ảnh bằng Gemini

Gemini có thể tạo và xử lý hình ảnh theo cách trò chuyện. Bạn có thể đưa ra câu lệnh cho Gemini bằng văn bản, hình ảnh hoặc kết hợp cả hai để thực hiện nhiều tác vụ liên quan đến hình ảnh, chẳng hạn như tạo và chỉnh sửa hình ảnh. Tất cả hình ảnh được tạo đều có hình mờ SynthID.

Tính năng tạo hình ảnh có thể chưa được hỗ trợ ở một số khu vực và quốc gia. Hãy xem trang Các mô hình Gemini của chúng tôi để biết thêm thông tin.

Tạo hình ảnh (chuyển văn bản thành hình ảnh)

Đoạn mã sau đây minh hoạ cách tạo hình ảnh dựa trên một câu lệnh mô tả. Bạn phải thêm responseModalities: ["TEXT", "IMAGE"] vào cấu hình của mình. Các mô hình này không hỗ trợ đầu ra chỉ có hình ảnh.

Python

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

client = genai.Client()

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

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

for part in response.candidates[0].content.parts:
  if part.text is not None:
    print(part.text)
  elif part.inline_data is not None:
    image = Image.open(BytesIO((part.inline_data.data)))
    image.save('gemini-native-image.png')
    image.show()

JavaScript

import { GoogleGenAI, Modality } from "@google/genai";
import * as fs from "node:fs";

async function main() {

  const ai = new GoogleGenAI({});

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

  // Set responseModalities to include "Image" so the model can generate  an image
  const response = await ai.models.generateContent({
    model: "gemini-2.0-flash-preview-image-generation",
    contents: contents,
    config: {
      responseModalities: [Modality.TEXT, Modality.IMAGE],
    },
  });
  for (const part of response.candidates[0].content.parts) {
    // Based on the part type, either show the text or save the image
    if (part.text) {
      console.log(part.text);
    } else if (part.inlineData) {
      const imageData = part.inlineData.data;
      const buffer = Buffer.from(imageData, "base64");
      fs.writeFileSync("gemini-native-image.png", buffer);
      console.log("Image saved as gemini-native-image.png");
    }
  }
}

main();

Go

package main

import (
  "context"
  "fmt"
  "os"
  "google.golang.org/genai"
)

func main() {

  ctx := context.Background()
  client, err := genai.NewClient(ctx, nil)
  if err != nil {
      log.Fatal(err)
  }

  config := &genai.GenerateContentConfig{
      ResponseModalities: []string{"TEXT", "IMAGE"},
  }

  result, _ := client.Models.GenerateContent(
      ctx,
      "gemini-2.0-flash-preview-image-generation",
      genai.Text("Hi, can you create a 3d rendered image of a pig " +
                 "with wings and a top hat flying over a happy " +
                 "futuristic scifi city with lots of greenery?"),
      config,
  )

  for _, part := range result.Candidates[0].Content.Parts {
      if part.Text != "" {
          fmt.Println(part.Text)
      } else if part.InlineData != nil {
          imageBytes := part.InlineData.Data
          outputFilename := "gemini_generated_image.png"
          _ = os.WriteFile(outputFilename, imageBytes, 0644)
      }
  }
}

REST

curl -s -X POST
  "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-preview-image-generation:generateContent" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [{
      "parts": [
        {"text": "Hi, can you create a 3d rendered image of a pig with wings and a top hat flying over a happy futuristic scifi city with lots of greenery?"}
      ]
    }],
    "generationConfig":{"responseModalities":["TEXT","IMAGE"]}
  }' \
  | grep -o '"data": "[^"]*"' \
  | cut -d'"' -f4 \
  | base64 --decode > gemini-native-image.png
Hình ảnh do AI tạo về một chú lợn bay trong thế giới giả tưởng
Hình ảnh do AI tạo về một chú lợn bay trong thế giới giả tưởng

Chỉnh sửa hình ảnh (chuyển văn bản và hình ảnh thành hình ảnh)

Để chỉnh sửa hình ảnh, hãy thêm hình ảnh làm dữ liệu đầu vào. Ví dụ sau đây minh hoạ việc tải hình ảnh được mã hoá base64 lên. Đối với nhiều hình ảnh và tải trọng lớn hơn, hãy kiểm tra phần đầu vào hình ảnh.

Python

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

import PIL.Image

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

client = genai.Client()

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

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

for part in response.candidates[0].content.parts:
  if part.text is not None:
    print(part.text)
  elif part.inline_data is not None:
    image = Image.open(BytesIO((part.inline_data.data)))
    image.show()

JavaScript

import { GoogleGenAI, Modality } from "@google/genai";
import * as fs from "node:fs";

async function main() {

  const ai = new GoogleGenAI({});

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

  // Prepare the content parts
  const contents = [
    { text: "Can you add a llama next to the image?" },
    {
      inlineData: {
        mimeType: "image/png",
        data: base64Image,
      },
    },
  ];

  // Set responseModalities to include "Image" so the model can generate an image
  const response = await ai.models.generateContent({
    model: "gemini-2.0-flash-preview-image-generation",
    contents: contents,
    config: {
      responseModalities: [Modality.TEXT, Modality.IMAGE],
    },
  });
  for (const part of response.candidates[0].content.parts) {
    // Based on the part type, either show the text or save the image
    if (part.text) {
      console.log(part.text);
    } else if (part.inlineData) {
      const imageData = part.inlineData.data;
      const buffer = Buffer.from(imageData, "base64");
      fs.writeFileSync("gemini-native-image.png", buffer);
      console.log("Image saved as gemini-native-image.png");
    }
  }
}

main();

Go

package main

import (
 "context"
 "fmt"
 "os"
 "google.golang.org/genai"
)

func main() {

 ctx := context.Background()
 client, err := genai.NewClient(ctx, nil)
 if err != nil {
     log.Fatal(err)
 }

 imagePath := "/path/to/image.png"
 imgData, _ := os.ReadFile(imagePath)

 parts := []*genai.Part{
   genai.NewPartFromText("Hi, This is a picture of me. Can you add a llama next to me?"),
   &genai.Part{
     InlineData: &genai.Blob{
       MIMEType: "image/png",
       Data:     imgData,
     },
   },
 }

 contents := []*genai.Content{
   genai.NewContentFromParts(parts, genai.RoleUser),
 }

 config := &genai.GenerateContentConfig{
     ResponseModalities: []string{"TEXT", "IMAGE"},
 }

 result, _ := client.Models.GenerateContent(
     ctx,
     "gemini-2.0-flash-preview-image-generation",
     contents,
     config,
 )

 for _, part := range result.Candidates[0].Content.Parts {
     if part.Text != "" {
         fmt.Println(part.Text)
     } else if part.InlineData != nil {
         imageBytes := part.InlineData.Data
         outputFilename := "gemini_generated_image.png"
         _ = os.WriteFile(outputFilename, imageBytes, 0644)
     }
 }
}

REST

IMG_PATH=/path/to/your/image1.jpeg

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

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

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

Các chế độ tạo hình ảnh khác

Gemini hỗ trợ các chế độ tương tác khác với hình ảnh dựa trên cấu trúc câu lệnh và ngữ cảnh, bao gồm:

  • Văn bản thành hình ảnh và văn bản (xen kẽ): Tạo ra hình ảnh kèm theo văn bản liên quan.
    • Ví dụ về câu lệnh: "Tạo một công thức minh hoạ cho món paella."
  • (Các) hình ảnh và văn bản thành(các) hình ảnh và văn bản (xen kẽ): Sử dụng hình ảnh và văn bản đầu vào để tạo hình ảnh và văn bản mới có liên quan.
    • Câu lệnh ví dụ: (Có hình ảnh một căn phòng được trang bị nội thất) "Những màu sắc nào khác của ghế sofa sẽ phù hợp với không gian của tôi? Bạn có thể cập nhật hình ảnh không?"
  • Chỉnh sửa ảnh nhiều lượt (trò chuyện): Tiếp tục tạo / chỉnh sửa ảnh theo cách trò chuyện.
    • Câu lệnh mẫu: [tải ảnh một chiếc ô tô màu xanh dương lên.] , "Biến chiếc xe này thành xe mui trần", "Bây giờ, hãy thay đổi màu thành vàng."

Các điểm hạn chế

  • Để đạt được hiệu suất tốt nhất, hãy sử dụng các ngôn ngữ sau: tiếng Anh, tiếng Tây Ban Nha (Mexico), tiếng Nhật, tiếng Trung (giản thể), tiếng Hindi (Ấn Độ).
  • Tính năng tạo hình ảnh không hỗ trợ dữ liệu đầu vào là âm thanh hoặc video.
  • Tính năng tạo hình ảnh có thể không phải lúc nào cũng kích hoạt:
    • Mô hình này chỉ có thể xuất văn bản. Hãy thử yêu cầu Gemini tạo hình ảnh một cách rõ ràng (ví dụ: "tạo một hình ảnh", "cung cấp hình ảnh trong quá trình trò chuyện", "cập nhật hình ảnh").
    • Mô hình có thể dừng tạo nội dung khi chưa hoàn tất. Hãy thử lại hoặc thử một câu lệnh khác.
  • Khi tạo văn bản cho một hình ảnh, Gemini hoạt động hiệu quả nhất nếu bạn tạo văn bản trước rồi yêu cầu tạo hình ảnh có văn bản đó.
  • Tính năng Tạo hình ảnh không hoạt động ở một số khu vực/quốc gia. Hãy xem phần Mô hình để biết thêm thông tin.

Trường hợp sử dụng Imagen

Ngoài việc sử dụng các tính năng tạo hình ảnh tích hợp của Gemini, bạn cũng có thể truy cập vào Imagen, mô hình tạo hình ảnh chuyên biệt của chúng tôi, thông qua Gemini API.

Chọn Gemini khi:

  • Bạn cần những hình ảnh phù hợp theo ngữ cảnh, tận dụng kiến thức và khả năng suy luận về thế giới.
  • Việc kết hợp liền mạch văn bản và hình ảnh là rất quan trọng.
  • Bạn muốn có hình ảnh chính xác được nhúng trong các chuỗi văn bản dài.
  • Bạn muốn chỉnh sửa hình ảnh theo cách trò chuyện trong khi vẫn duy trì ngữ cảnh.

Chọn Imagen khi:

  • Chất lượng hình ảnh, độ chân thực, chi tiết nghệ thuật hoặc phong cách cụ thể (ví dụ: trường phái ấn tượng, hoạt hình Nhật Bản) là những yếu tố được ưu tiên hàng đầu.
  • Thực hiện các tác vụ chỉnh sửa chuyên biệt như cập nhật nền sản phẩm hoặc nâng cấp hình ảnh.
  • Truyền tải thương hiệu, phong cách hoặc tạo biểu trưng và thiết kế sản phẩm.

Imagen 4 là mô hình bạn nên dùng để bắt đầu tạo hình ảnh bằng Imagen. Chọn Imagen 4 Ultra cho các trường hợp sử dụng nâng cao hoặc khi bạn cần chất lượng hình ảnh tốt nhất. Xin lưu ý rằng Imagen 4 Ultra chỉ có thể tạo một hình ảnh mỗi lần.

Bước tiếp theo