หน้านี้อธิบายวิธีใช้การเติมรูปภาพบางส่วนโดยใช้ Imagen เพื่อ นำวัตถุออกจากรูปภาพ โดยใช้ SDK ของ Firebase AI Logic
การวาดภาพเติมเป็นการแก้ไขตามมาสก์ประเภทหนึ่ง มาสก์คือการซ้อนทับแบบดิจิทัล ที่กำหนดพื้นที่เฉพาะที่คุณต้องการแก้ไข
วิธีการทำงาน: คุณระบุรูปภาพต้นฉบับและรูปภาพที่มาสก์ที่สอดคล้องกัน ซึ่งอาจเป็นรูปภาพที่ระบบสร้างขึ้นโดยอัตโนมัติหรือรูปภาพที่คุณระบุ ซึ่งกำหนดมาสก์เหนือออบเจ็กต์หรือชิ้นงานที่ต้องการนำออก นอกจากนี้ คุณยัง ระบุพรอมต์ข้อความที่อธิบายสิ่งที่คุณต้องการนำออกได้ด้วย หรือ โมเดลจะตรวจหาออบเจ็กต์ที่จะนำออกได้อย่างชาญฉลาด จากนั้นโมเดลจะ นำออบเจ็กต์ออกและเติมพื้นที่ด้วยเนื้อหาใหม่ที่เหมาะสมตามบริบท
เช่น คุณสามารถมาสก์ลูกบอลและแทนที่ด้วยผนังเปล่าหรือสนามหญ้าได้
ข้ามไปยังโค้ดสำหรับมาสก์ที่สร้างขึ้นโดยอัตโนมัติ ข้ามไปยังโค้ดสำหรับการระบุมาสก์
ก่อนเริ่มต้น
| ใช้ได้เมื่อใช้ Vertex AI Gemini API เป็นผู้ให้บริการ API เท่านั้น | 
  หากยังไม่ได้ดำเนินการ ให้ทำตามคู่มือเริ่มต้นใช้งาน ซึ่งอธิบายวิธีตั้งค่าโปรเจ็กต์ Firebase, เชื่อมต่อแอปกับ Firebase, เพิ่ม SDK, เริ่มต้นบริการแบ็กเอนด์สำหรับผู้ให้บริการ API ที่เลือก และสร้างอินสแตนซ์ ImagenModel
รุ่นที่รองรับความสามารถนี้
  Imagen มีบริการแก้ไขรูปภาพผ่านโมเดล capability
  ดังนี้
- imagen-3.0-capability-001
  โปรดทราบว่าสำหรับโมเดล Imagen ระบบไม่รองรับตำแหน่ง global
นำวัตถุออกโดยใช้มาสก์ที่สร้างขึ้นโดยอัตโนมัติ
| ก่อนที่จะลองใช้ตัวอย่างนี้ ให้ทำส่วนก่อนเริ่มต้นของคู่มือนี้ เพื่อตั้งค่าโปรเจ็กต์และแอป | 
ตัวอย่างต่อไปนี้แสดงวิธีใช้การวาดภาพเติมเพื่อนำเนื้อหาออกจากรูปภาพโดยใช้การสร้างมาสก์อัตโนมัติ คุณระบุรูปภาพต้นฉบับและพรอมต์ข้อความ แล้ว Imagen จะตรวจหาและสร้างพื้นที่มาสก์เพื่อแก้ไขรูปภาพต้นฉบับโดยอัตโนมัติ
Swift
Swift ไม่รองรับการแก้ไขรูปภาพด้วยโมเดล Imagen โปรดกลับมาตรวจสอบอีกครั้งในปลายปีนี้
Kotlin
หากต้องการนำออบเจ็กต์ที่มีมาสก์ที่สร้างขึ้นโดยอัตโนมัติออก ให้ระบุ
ImagenBackgroundMask ใช้
editImage()
และตั้งค่าการแก้ไขให้ใช้ ImagenEditMode.INPAINT_REMOVAL
// Using this SDK to access Imagen models is a Preview release and requires opt-in
@OptIn(PublicPreviewAPI::class)
suspend fun customizeImage() {
    // Initialize the Vertex AI Gemini API backend service
    // Optionally specify the location to access the model (for example, `us-central1`)
    val ai = Firebase.ai(backend = GenerativeBackend.vertexAI(location = "us-central1"))
    // Create an `ImagenModel` instance with an Imagen "capability" model
    val model = ai.imagenModel("imagen-3.0-capability-001")
    // This example assumes 'originalImage' is a pre-loaded Bitmap.
    // In a real app, this might come from the user's device or a URL.
    val originalImage: Bitmap = TODO("Load your original image Bitmap here")
    // Provide the prompt describing the content to be removed.
    val prompt = "ball"
    // Use the editImage API to remove the unwanted content.
    // Pass the original image, the prompt, and an editing configuration.
    val editedImage = model.editImage(
        referenceImages = listOf(
            ImagenRawImage(originalImage.toImagenInlineImage()),
            ImagenBackgroundMask(), // Use ImagenBackgroundMask() to auto-generate the mask.
        ),
        prompt = prompt,
        // Define the editing configuration for inpainting and insertion.
        config = ImagenEditingConfig(ImagenEditMode.INPAINT_REMOVAL)
    )
    // Process the resulting 'editedImage' Bitmap, for example, by displaying it in an ImageView.
}
Java
หากต้องการนำออบเจ็กต์ที่มีมาสก์ที่สร้างขึ้นโดยอัตโนมัติออก ให้ระบุ
ImagenBackgroundMask ใช้
editImage()
และตั้งค่าการแก้ไขให้ใช้ ImagenEditMode.INPAINT_REMOVAL
// Initialize the Vertex AI Gemini API backend service
// Optionally specify the location to access the model (for example, `us-central1`)
// Create an `ImagenModel` instance with an Imagen "capability" model
ImagenModel imagenModel = FirebaseAI.getInstance(GenerativeBackend.vertexAI("us-central1"))
        .imagenModel(
                /* modelName */ "imagen-3.0-capability-001");
ImagenModelFutures model = ImagenModelFutures.from(imagenModel);
// This example assumes 'originalImage' is a pre-loaded Bitmap.
// In a real app, this might come from the user's device or a URL.
Bitmap originalImage = null; // TODO("Load your image Bitmap here");
// Provide the prompt describing the content to be removed.
String prompt = "ball";
// Define the list of sources for the editImage call.
// This includes the original image and the auto-generated mask.
ImagenRawImage rawOriginalImage =
    new ImagenRawImage(ImagenInlineImageKt.toImagenInlineImage(originalImage));
// Use ImagenBackgroundMask() to auto-generate the mask.
ImagenBackgroundMask rawMaskedImage = new ImagenBackgroundMask();
ImagenEditingConfig config = new ImagenEditingConfig();
// Use the editImage API to remove the unwanted content.
// Pass the original image, the auto-generated masked image, the prompt, and an editing configuration.
Futures.addCallback(model.editImage(Arrays.asList(rawOriginalImage, rawMaskedImage), prompt, config),
    new FutureCallback<ImagenGenerationResponse>() {
        @Override
        public void onSuccess(ImagenGenerationResponse result) {
            if (result.getImages().isEmpty()) {
                Log.d("ImageEditor", "No images generated");
            }
            Bitmap editedImage = ((ImagenInlineImage) result.getImages().get(0)).asBitmap();
            // Process and use the bitmap to display the image in your UI
        }
        @Override
        public void onFailure(Throwable t) {
            // ...
        }
    }, Executors.newSingleThreadExecutor());
  Web
แอปบนเว็บไม่รองรับการแก้ไขรูปภาพด้วยโมเดล Imagen โปรดกลับมาตรวจสอบอีกครั้งในปลายปีนี้
Dart
หากต้องการนำออบเจ็กต์ที่มีมาสก์ที่สร้างขึ้นโดยอัตโนมัติออก ให้ระบุ
ImagenBackgroundMask ใช้
editImage() 
และตั้งค่าการแก้ไขให้ใช้ ImagenEditMode.inpaintRemoval
import 'dart:typed_data';
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
// Initialize FirebaseApp
await Firebase.initializeApp(
  options: DefaultFirebaseOptions.currentPlatform,
);
// Initialize the Vertex AI Gemini API backend service
// Optionally specify a location to access the model (for example, `us-central1`)
final ai = FirebaseAI.vertexAI(location: 'us-central1');
// Create an `ImagenModel` instance with an Imagen "capability" model
final model = ai.imagenModel(model: 'imagen-3.0-capability-001');
TODO - FLUTTER// This example assumes 'originalImage' is a pre-loaded Uint8List.
// In a real app, this might come from the user's device or a URL.
final Uint8List originalImage = Uint8List(0); // TODO: Load your original image data here.
// Provide the prompt describing the content to be removed.
final prompt = 'ball';
try {
  // Use the editImage API to remove the unwanted content.
  // Pass the original image, the prompt, and an editing configuration.
  final response = await model.editImage(
    sources: [
      ImagenRawImage(originalImage),
      ImagenBackgroundMask(),  // Use ImagenBackgroundMask() to auto-generate the mask.
    ],
    prompt,
    // Define the editing configuration for inpainting and removal.
    config: const ImagenEditingConfig(
      editMode: ImagenEditMode.inpaintRemoval,
    ),
  );
  // Process the result.
  if (response.images.isNotEmpty) {
    final editedImage = response.images.first.bytes;
    // Use the editedImage (a Uint8List) to display the image, save it, etc.
    print('Image successfully generated!');
  } else {
    // Handle the case where no images were generated.
    print('Error: No images were generated.');
  }
} catch (e) {
  // Handle any potential errors during the API call.
  print('An error occurred: $e');
}
Unity
Unity ไม่รองรับการแก้ไขรูปภาพด้วยโมเดล Imagen โปรดกลับมาตรวจสอบอีกครั้งในปลายปีนี้
นำออบเจ็กต์ออกโดยใช้มาสก์ที่ระบุ
| ก่อนที่จะลองใช้ตัวอย่างนี้ ให้ทำส่วนก่อนเริ่มต้นของคู่มือนี้ เพื่อตั้งค่าโปรเจ็กต์และแอป | 
ตัวอย่างต่อไปนี้แสดงวิธีใช้การเติมรูปภาพบางส่วนเพื่อนำเนื้อหาออกจากรูปภาพ โดยใช้มาสก์ที่กำหนดไว้ในรูปภาพที่คุณระบุ คุณระบุรูปภาพต้นฉบับ พรอมต์ข้อความ และรูปภาพที่มาสก์
การระบุพรอมต์ข้อความเป็นทางเลือกหากคุณระบุรูปภาพที่มาสก์ Imagen สามารถตรวจจับออบเจ็กต์ที่จะนำออกจากพื้นที่ที่มาสก์ได้อย่างชาญฉลาด อย่างไรก็ตาม หากวัตถุที่ต้องการนำออกไม่ชัดเจน หรือต้องการนำออกเฉพาะวัตถุบางอย่างในพื้นที่ที่มาสก์ไว้ ให้ระบุพรอมต์ข้อความเพื่อช่วยโมเดลนำวัตถุที่ถูกต้องออก
Swift
Swift ไม่รองรับการแก้ไขรูปภาพด้วยโมเดล Imagen โปรดกลับมาตรวจสอบอีกครั้งในปลายปีนี้
Kotlin
หากต้องการนำออบเจ็กต์ออกและระบุรูปภาพที่มาสก์ของคุณเอง ให้ระบุ
ImagenRawMask พร้อมรูปภาพที่มาสก์ ใช้
editImage()
และตั้งค่าการแก้ไขให้ใช้ ImagenEditMode.INPAINT_REMOVAL
// Using this SDK to access Imagen models is a Preview release and requires opt-in
@OptIn(PublicPreviewAPI::class)
suspend fun customizeImage() {
    // Initialize the Vertex AI Gemini API backend service
    // Optionally specify the location to access the model (for example, `us-central1`)
    val ai = Firebase.ai(backend = GenerativeBackend.vertexAI(location = "us-central1"))
    // Create an `ImagenModel` instance with an Imagen "capability" model
    val model = ai.imagenModel("imagen-3.0-capability-001")
    // This example assumes 'originalImage' is a pre-loaded Bitmap.
    // In a real app, this might come from the user's device or a URL.
    val originalImage: Bitmap = TODO("Load your original image Bitmap here")
    // This example assumes 'maskImage' is a pre-loaded Bitmap that contains the masked area.
    // In a real app, this might come from the user's device or a URL.
    val maskImage: Bitmap = TODO("Load your masked image Bitmap here")
    // Provide the prompt describing the content to be removed.
    val prompt = "ball"
    // Use the editImage API to remove the unwanted content.
    // Pass the original image, the masked image, the prompt, and an editing configuration.
    val editedImage = model.editImage(
        referenceImages = listOf(
            ImagenRawImage(originalImage.toImagenInlineImage()),
            ImagenRawMask(maskImage.toImagenInlineImage()), // Use ImagenRawMask() to provide your own masked image.
        ),
        prompt = prompt,
        // Define the editing configuration for inpainting and removal.
        config = ImagenEditingConfig(ImagenEditMode.INPAINT_REMOVAL)
    )
    // Process the resulting 'editedImage' Bitmap, for example, by displaying it in an ImageView.
}
Java
หากต้องการนำออบเจ็กต์ออกและระบุรูปภาพที่มาสก์ของคุณเอง ให้ระบุ
ImagenRawMask พร้อมรูปภาพที่มาสก์ ใช้
editImage()
และตั้งค่าการแก้ไขให้ใช้ ImagenEditMode.INPAINT_REMOVAL
// Initialize the Vertex AI Gemini API backend service
// Optionally specify the location to access the model (for example, `us-central1`)
// Create an `ImagenModel` instance with an Imagen "capability" model
ImagenModel imagenModel = FirebaseAI.getInstance(GenerativeBackend.vertexAI("us-central1"))
        .imagenModel(
                /* modelName */ "imagen-3.0-capability-001");
ImagenModelFutures model = ImagenModelFutures.from(imagenModel);
// This example assumes 'originalImage' is a pre-loaded Bitmap.
// In a real app, this might come from the user's device or a URL.
Bitmap originalImage = null; // TODO("Load your original image Bitmap here");
// This example assumes 'maskImage' is a pre-loaded Bitmap that contains the masked area.
// In a real app, this might come from the user's device or a URL.
Bitmap maskImage = null; // TODO("Load your masked image Bitmap here");
// Provide the prompt describing the content to be removed.
String prompt = "ball";
// Define the list of source images for the editImage call.
ImagenRawImage rawOriginalImage =
    new ImagenRawImage(ImagenInlineImageKt.toImagenInlineImage(originalImage));
 // Use ImagenRawMask() to provide your own masked image.
ImagenBackgroundMask rawMaskedImage =
    new ImagenRawMask(ImagenInlineImageKt.toImagenInlineImage(maskImage));
ImagenEditingConfig config = new ImagenEditingConfig();
// Use the editImage API to remove the unwanted content.
// Pass the original image, the masked image, the prompt, and an editing configuration.
Futures.addCallback(model.editImage(Arrays.asList(rawOriginalImage, rawMaskedImage), prompt, config),
    new FutureCallback<ImagenGenerationResponse>() {
        @Override
        public void onSuccess(ImagenGenerationResponse result) {
            if (result.getImages().isEmpty()) {
                Log.d("ImageEditor", "No images generated");
            }
            Bitmap editedImage = ((ImagenInlineImage) result.getImages().get(0)).asBitmap();
            // Process and use the bitmap to display the image in your UI
        }
        @Override
        public void onFailure(Throwable t) {
            // ...
        }
    }, Executors.newSingleThreadExecutor());
  Web
แอปบนเว็บไม่รองรับการแก้ไขรูปภาพด้วยโมเดล Imagen โปรดกลับมาตรวจสอบอีกครั้งในปลายปีนี้
Dart
หากต้องการนำออบเจ็กต์ออกและระบุรูปภาพที่มาสก์ของคุณเอง ให้ระบุ
ImagenRawMask พร้อมรูปภาพที่มาสก์ ใช้
editImage() 
และตั้งค่าการแก้ไขให้ใช้ ImagenEditMode.inpaintRemoval
import 'dart:typed_data';
import 'package:firebase_ai/firebase_ai.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
// Initialize FirebaseApp
await Firebase.initializeApp(
  options: DefaultFirebaseOptions.currentPlatform,
);
// Initialize the Vertex AI Gemini API backend service
// Optionally specify a location to access the model (for example, `us-central1`)
final ai = FirebaseAI.vertexAI(location: 'us-central1');
// Create an `ImagenModel` instance with an Imagen "capability" model
final model = ai.imagenModel(model: 'imagen-3.0-capability-001');
// This example assumes 'originalImage' is a pre-loaded Uint8List.
// In a real app, this might come from the user's device or a URL.
final Uint8List originalImage = Uint8List(0); // TODO: Load your original image data here.
// This example assumes 'maskImage' is a pre-loaded Uint8List that contains the masked area.
// In a real app, this might come from the user's device or a URL.
final Uint8List maskImage = Uint8List(0); // TODO: Load your masked image data here.
// Provide the prompt describing the content to be removed.
final prompt = 'ball';
try {
  // Use the editImage API to remove the unwanted content.
  // Pass the original image, the prompt, and an editing configuration.
  final response = await model.editImage(
    sources: [
      ImagenRawImage(originalImage),
      ImagenRawMask(maskImage), // Use ImagenRawMask() to provide your own masked image.
    ],
    prompt: prompt,
    // Define the editing configuration for inpainting and removal.
    config: const ImagenEditingConfig(
      editMode: ImagenEditMode.inpaintRemoval,
    ),
  );
  // Process the result.
  if (response.images.isNotEmpty) {
    final editedImage = response.images.first.bytes;
    // Use the editedImage (a Uint8List) to display the image, save it, etc.
    print('Image successfully generated!');
  } else {
    // Handle the case where no images were generated.
    print('Error: No images were generated.');
  }
} catch (e) {
  // Handle any potential errors during the API call.
  print('An error occurred: $e');
}
Unity
Unity ไม่รองรับการแก้ไขรูปภาพด้วยโมเดล Imagen โปรดกลับมาตรวจสอบอีกครั้งในปลายปีนี้
แนวทางปฏิบัติแนะนำและข้อจำกัด
เราขอแนะนำให้ขยายมาสก์เมื่อแก้ไขรูปภาพ ซึ่งจะช่วยให้ขอบของการแก้ไขเรียบเนียนขึ้น
  และดูสมจริงยิ่งขึ้น โดยทั่วไป เราขอแนะนำให้ใช้ค่าการขยาย
  ที่ 1% หรือ 2% (0.01 หรือ 0.02)
แสดงความคิดเห็น เกี่ยวกับประสบการณ์การใช้งาน Firebase AI Logic