Tạo hình ảnh

Gemini API hỗ trợ tạo hình ảnh bằng Gemini 2.0 Flash Experimental và bằng Imagen 3. Hướng dẫn này sẽ giúp bạn bắt đầu sử dụng cả hai mô hình.

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

Gemini 2.0 Flash Experimental hỗ trợ khả năng xuất văn bản và hình ảnh cùng dòng. Điều này cho phép bạn sử dụng Gemini để chỉnh sửa hình ảnh theo cách trò chuyện hoặc tạo đầu ra có văn bản đan xen (ví dụ: tạo một bài đăng trên blog có văn bản và hình ảnh trong một lượt). Tất cả hình ảnh được tạo đều có hình mờ SynthID và hình ảnh trong Google AI Studio cũng có hình mờ hiển thị.

Ví dụ sau đây cho thấy cách sử dụng Gemini 2.0 để tạo đầu ra văn bản và hình ảnh:

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

client = genai.Client()

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

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

for part in response.candidates[0].content.parts:
  if part.text is not None:
    print(part.text)
  elif part.inline_data is not None:
    image = Image.open(BytesIO((part.inline_data.data)))
    image.save('gemini-native-image.png')
    image.show()
const { GoogleGenerativeAI } = require("@google/generative-ai");
const fs = require("fs");

const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);

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

  // Set responseModalities to include "Image" so the model can generate  an image
  const model = genAI.getGenerativeModel({
    model: "gemini-2.0-flash-exp-image-generation",
    generationConfig: {
        responseModalities: ['Text', 'Image']
    },
  });

  try {
    const response = await model.generateContent(contents);
    for (const part of  response.response.candidates[0].content.parts) {
      // Based on the part type, either show the text or save the image
      if (part.text) {
        console.log(part.text);
      } else if (part.inlineData) {
        const imageData = part.inlineData.data;
        const buffer = Buffer.from(imageData, 'base64');
        fs.writeFileSync('gemini-native-image.png', buffer);
        console.log('Image saved as gemini-native-image.png');
      }
    }
  } catch (error) {
    console.error("Error generating content:", error);
  }
}

generateImage();
curl -s -X POST \
  "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp-image-generation:generateContent?key=$GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [{
      "parts": [
        {"text": "Hi, can you create a 3d rendered image of a pig with wings and a top hat flying over a happy futuristic scifi city with lots of greenery?"}
      ]
    }],
    "generationConfig":{"responseModalities":["Text","Image"]}
  }' \
  | grep -o '"data": "[^"]*"' \
  | cut -d'"' -f4 \
  | base64 --decode > gemini-native-image.png
Hình ảnh do AI tạo ra về một con lợn bay kỳ ảo
Hình ảnh do AI tạo về một con lợn bay kỳ lạ

Tuỳ thuộc vào câu lệnh và ngữ cảnh, Gemini sẽ tạo nội dung ở nhiều chế độ (văn bản sang hình ảnh, văn bản sang hình ảnh và văn bản, v.v.). Dưới đây là một số ví dụ:

  • Chuyển văn bản thành hình ảnh
    • Câu lệnh ví dụ: "Tạo hình ảnh tháp Eiffel có pháo hoa ở nền sau."
  • Văn bản sang(các) hình ảnh và văn bản (xen kẽ)
    • Câu lệnh ví dụ: "Tạo một công thức nấu ăn 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ẽ)
    • Câu lệnh mẫu: (Có hình ảnh một phòng được trang bị đồ nội thất) "Có màu sofa nào khác phù hợp với không gian của tôi không? Bạn có thể cập nhật hình ảnh không?"
  • Chỉnh sửa hình ảnh (văn bản và hình ảnh thành hình ảnh)
    • Câu lệnh ví dụ: "Chỉnh sửa hình ảnh này để trông giống như một bức tranh hoạt hình"
    • Ví dụ về câu lệnh: [hình ảnh một con mèo] + [hình ảnh một chiếc gối] + "Tạo hình thêu chữ thập của con mèo của tôi trên chiếc gối này".
  • Chỉnh sửa hình ảnh nhiều lượt (trò chuyện)
    • Câu lệnh mẫu: [tải hình ảnh một chiếc xe màu xanh dương lên.] "Chuyển đổi chiếc xe này thành xe mui trần." "Bây giờ, hãy thay đổi màu thành màu vàng."

Chỉnh sửa hình ảnh bằng Gemini

Để 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ạ cách 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.

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

import PIL.Image

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

client = genai.Client()

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

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

for part in response.candidates[0].content.parts:
  if part.text is not None:
    print(part.text)
  elif part.inline_data is not None:
    image = Image.open(BytesIO(part.inline_data.data))
    image.show()
const { GoogleGenerativeAI } = require("@google/generative-ai");
const fs = require("fs");

const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);

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

    // Prepare the content parts
    const contents = [
        { text: "Hi, This is a picture of me. Can you add a llama next to me?" },
        {
          inlineData: {
            mimeType: 'image/png',
            data: base64Image
          }
        }
      ];

  // Set responseModalities to include "Image" so the model can generate an image
  const model = genAI.getGenerativeModel({
    model: "gemini-2.0-flash-exp-image-generation",
    generationConfig: {
        responseModalities: ['Text', 'Image']
    },
  });

  try {
    const response = await model.generateContent(contents);
    for (const part of  response.response.candidates[0].content.parts) {
      // Based on the part type, either show the text or save the image
      if (part.text) {
        console.log(part.text);
      } else if (part.inlineData) {
        const imageData = part.inlineData.data;
        const buffer = Buffer.from(imageData, 'base64');
        fs.writeFileSync('gemini-native-image.png', buffer);
        console.log('Image saved as gemini-native-image.png');
      }
    }
  } catch (error) {
    console.error("Error generating content:", error);
  }
}

generateImage();
IMG_PATH=/path/to/your/image1.jpeg

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

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

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

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

  • Để có hiệu suất tốt nhất, hãy sử dụng các ngôn ngữ sau: EN, es-MX, ja-JP, zh-CN, hi-IN.
  • Tính năng tạo hình ảnh không hỗ trợ đầu vào âm thanh hoặc video.
  • Tính năng tạo hình ảnh không phải lúc nào cũng kích hoạt:
    • Mô hình có thể chỉ xuất văn bản. Hãy thử yêu cầu đầu ra hình ảnh một cách rõ ràng (ví dụ: "tạo hình ảnh", "cung cấp hình ảnh khi bạn thực hiện", "cập nhật hình ảnh").
    • Mô hình có thể ngừng tạo trong quá trình tạo. Hãy thử lại hoặc thử một câu lệnh khác.
  • Khi tạo văn bản cho hình ảnh, Gemini hoạt động hiệu quả nhất nếu trước tiên bạn tạo văn bản, sau đó yêu cầu hình ảnh có văn bản đó.

Chọn một mô hình

Bạn nên sử dụng mô hình nào để tạo hình ảnh? Điều này tuỳ thuộc vào trường hợp sử dụng của bạn.

Gemini 2.0 phù hợp nhất để tạo hình ảnh phù hợp theo ngữ cảnh, kết hợp văn bản và hình ảnh, kết hợp kiến thức về thế giới và suy luận về hình ảnh. Bạn có thể sử dụng tính năng này để tạo hình ảnh chính xác, phù hợp theo ngữ cảnh được nhúng trong các trình tự văn bản dài. Bạn cũng có thể chỉnh sửa hình ảnh theo cách trò chuyện, sử dụng ngôn ngữ tự nhiên, đồng thời duy trì ngữ cảnh trong suốt cuộc trò chuyện.

Nếu chất lượng hình ảnh là ưu tiên hàng đầu của bạn, thì Imagen 3 sẽ là lựa chọn phù hợp hơn. Imagen 3 nổi trội về độ chân thực của ảnh, chi tiết nghệ thuật và các phong cách nghệ thuật cụ thể như trường phái ấn tượng hoặc anime. Imagen 3 cũng là một lựa chọn phù hợp cho các nhiệm vụ chỉnh sửa hình ảnh chuyên biệt như cập nhật nền sản phẩm, nâng cấp hình ảnh và truyền tải thương hiệu cũng như phong cách vào hình ảnh. Bạn có thể sử dụng Imagen 3 để tạo biểu trưng hoặc các thiết kế sản phẩm mang thương hiệu khác.

Tạo hình ảnh bằng Imagen 3

API Gemini cung cấp quyền truy cập vào Imagen 3, mô hình chuyển văn bản thành hình ảnh có chất lượng cao nhất của Google, với một số tính năng mới và cải tiến. Imagen 3 có thể làm những việc sau:

  • Tạo hình ảnh có chi tiết tốt hơn, ánh sáng phong phú hơn và ít cấu trúc lạ gây mất tập trung hơn so với các mô hình trước
  • Hiểu được câu lệnh được viết bằng ngôn ngữ tự nhiên
  • Tạo hình ảnh ở nhiều định dạng và phong cách
  • Kết xuất văn bản hiệu quả hơn so với các mô hình trước
PythonREST
from google import genai
from google.genai import types
from PIL import Image
from io import BytesIO

client = genai.Client(api_key='GEMINI_API_KEY')

response = client.models.generate_images(
    model='imagen-3.0-generate-002',
    prompt='Fuzzy bunnies in my kitchen',
    config=types.GenerateImagesConfig(
        number_of_images= 4,
    )
)
for generated_image in response.generated_images:
  image = Image.open(BytesIO(generated_image.image.image_bytes))
  image.show()
curl -X POST \
    "https://generativelanguage.googleapis.com/v1beta/models/imagen-3.0-generate-002:predict?key=GEMINI_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
        "instances": [
          {
            "prompt": "Fuzzy bunnies in my kitchen"
          }
        ],
        "parameters": {
          "sampleCount": 4
        }
      }'
Hình ảnh do AI tạo về hai chú thỏ nhồi bông trong bếp
Hình ảnh do AI tạo về hai chú thỏ nhồi bông trong bếp

Hiện tại, Imagen chỉ hỗ trợ câu lệnh bằng tiếng Anh và các thông số sau:

Tham số mô hình Imagen

  • number_of_images: Số lượng hình ảnh cần tạo, từ 1 đến 4 (bao gồm cả 1 và 4). Giá trị mặc định là 4.
  • aspect_ratio: Thay đổi tỷ lệ khung hình của hình ảnh được tạo. Các giá trị được hỗ trợ là "1:1", "3:4", "4:3", "9:16""16:9". Giá trị mặc định là "1:1".
  • person_generation: Cho phép mô hình tạo hình ảnh của con người. Những giá trị sau đây được hỗ trợ:
    • "DONT_ALLOW": Chặn việc tạo hình ảnh của người.
    • "ALLOW_ADULT": Tạo hình ảnh về người lớn, nhưng không phải trẻ em. Đây là lựa chọn mặc định.

Bước tiếp theo