Objekte mit Imagen in Bilder einfügen


Auf dieser Seite wird beschrieben, wie Sie mit Imagen Inpainting verwenden, um ein Objekt in ein Bild einzufügen und zwar mit den Firebase AI Logic SDKs.

Inpainting ist eine Art der maskenbasierten Bearbeitung. Eine Maske ist eine digitale Überlagerung, die den zu bearbeitenden Bereich definiert.

Funktionsweise: Sie stellen ein Originalbild und ein entsprechendes maskiertes Bild bereit, das entweder automatisch generiert oder von Ihnen bereitgestellt wird. Es definiert eine Maske über einem Bereich, in dem Sie neue Inhalte hinzufügen möchten. Außerdem geben Sie einen Text-Prompt an, der beschreibt, was Sie hinzufügen möchten. Das Modell generiert und fügt dann neue Inhalte im maskierten Bereich hinzu.

Sie können beispielsweise einen Tisch maskieren und das Modell auffordern, eine Blumenvase mit Blumen hinzuzufügen.

Zum Code für die automatisch generierte Maske springen Zum Code für die Bereitstellung der Maske springen

Hinweis

Nur verfügbar, wenn die Vertex AI Gemini API als Ihr API-Anbieter verwendet wird.

Wenn Sie es noch nicht getan haben, folgen Sie der Anleitung für die ersten Schritte. Dort wird beschrieben, wie Sie Ihr Firebase-Projekt einrichten, Ihre App mit Firebase verbinden, das SDK hinzufügen, den Backend-Dienst für den ausgewählten API-Anbieter initialisieren und eine ImagenModel Instanz erstellen.

Modelle, die diese Funktion unterstützen

Imagen bietet Bildbearbeitung über das capability -Modell:

  • imagen-3.0-capability-001

Beachten Sie, dass der Standort global für Imagen Modelle nicht unterstützt wird.

Objekte mit einer automatisch generierten Maske einfügen

Bevor Sie dieses Beispiel ausprobieren, führen Sie die Schritte im Abschnitt Vorbereitung dieser Anleitung aus, um Ihr Projekt und Ihre App einzurichten.

Das folgende Beispiel zeigt, wie Sie mit Inpainting Inhalte in ein Bild einfügen – mit automatischer Maskengenerierung. Sie stellen das Originalbild und einen Text-Prompt bereit. Imagen erkennt und erstellt automatisch einen Maskenbereich, um das Originalbild zu ändern.

Swift

Die Bildbearbeitung mit Imagen Modellen wird für Swift nicht unterstützt. Folgt im weiteren Verlauf dieses Jahres.

Kotlin

Wenn Sie Objekte mit einer automatisch generierten Maske einfügen möchten, geben Sie ImagenBackgroundMask an. Verwenden Sie editImage() und legen Sie die Bearbeitungskonfiguration so fest, dass ImagenEditMode.INPAINT_INSERTION verwendet wird.

// 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 inserted.
    val prompt = "a vase of flowers on the table"

    // Use the editImage API to insert the new 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_INSERTION)
    )

    // Process the resulting 'editedImage' Bitmap, for example, by displaying it in an ImageView.
}

Java

Wenn Sie Objekte mit einer automatisch generierten Maske einfügen möchten, geben Sie ImagenBackgroundMask an. Verwenden Sie editImage() und legen Sie die Bearbeitungskonfiguration so fest, dass ImagenEditMode.INPAINT_INSERTION verwendet wird.

// 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 inserted.
String prompt = "a vase of flowers on the table";

// 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 insert the new 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

Die Bildbearbeitung mit Imagen Modellen wird für Web-Apps nicht unterstützt. Folgt im weiteren Verlauf dieses Jahres.

Dart

Wenn Sie Objekte mit einer automatisch generierten Maske einfügen möchten, geben Sie ImagenBackgroundMask an. Verwenden Sie editImage() und legen Sie die Bearbeitungskonfiguration so fest, dass ImagenEditMode.inpaintInsertion verwendet wird.

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.

// Provide the prompt describing the content to be inserted.
final prompt = 'a vase of flowers on the table';

try {
  // Use the editImage API to insert the new 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: prompt,
    // Define the editing configuration for inpainting and insertion.
    config: const ImagenEditingConfig(
      editMode: ImagenEditMode.inpaintInsertion,
    ),
  );

  // 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');
}

Einheit

Die Bildbearbeitung mit Imagen Modellen wird für Unity nicht unterstützt. Folgt im weiteren Verlauf dieses Jahres.

Objekte mit einer bereitgestellten Maske einfügen

Bevor Sie dieses Beispiel ausprobieren, führen Sie die Schritte im Abschnitt Vorbereitung dieser Anleitung aus, um Ihr Projekt und Ihre App einzurichten.

Das folgende Beispiel zeigt, wie Sie mit Inpainting Inhalte in ein Bild einfügen – mit einer Maske, die in einem von Ihnen bereitgestellten Bild definiert ist. Sie stellen das Originalbild, einen Text-Prompt und das maskierte Bild bereit.

Swift

Die Bildbearbeitung mit Imagen Modellen wird für Swift nicht unterstützt. Folgt im weiteren Verlauf dieses Jahres.

Kotlin

Wenn Sie Objekte einfügen und ein eigenes maskiertes Bild bereitstellen möchten, geben Sie ImagenRawMask mit dem maskierten Bild an. Verwenden Sie editImage() und legen Sie die Bearbeitungskonfiguration so fest, dass ImagenEditMode.INPAINT_INSERTION verwendet wird.

// 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 inserted.
    val prompt = "a vase of flowers on the table"

    // Use the editImage API to insert the new 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 insertion.
        config = ImagenEditingConfig(ImagenEditMode.INPAINT_INSERTION)
    )

    // Process the resulting 'editedImage' Bitmap, for example, by displaying it in an ImageView.
}

Java

Wenn Sie Objekte einfügen und ein eigenes maskiertes Bild bereitstellen möchten, geben Sie ImagenRawMask mit dem maskierten Bild an. Verwenden Sie editImage() und legen Sie die Bearbeitungskonfiguration so fest, dass ImagenEditMode.INPAINT_INSERTION verwendet wird.

// 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 inserted.
String prompt = "a vase of flowers on the table";

// 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 insert the new 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

Die Bildbearbeitung mit Imagen Modellen wird für Web-Apps nicht unterstützt. Folgt im weiteren Verlauf dieses Jahres.

Dart

Wenn Sie Objekte einfügen und ein eigenes maskiertes Bild bereitstellen möchten, geben Sie ImagenRawMask mit dem maskierten Bild an. Verwenden Sie editImage() und legen Sie die Bearbeitungskonfiguration so fest, dass ImagenEditMode.inpaintInsertion verwendet wird.

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 inserted.
final prompt = 'a vase of flowers on the table';

try {
  // Use the editImage API to insert the new 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 insertion.
    config: const ImagenEditingConfig(
      editMode: ImagenEditMode.inpaintInsertion,
    ),
  );

  // 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');
}

Einheit

Die Bildbearbeitung mit Imagen Modellen wird für Unity nicht unterstützt. Folgt im weiteren Verlauf dieses Jahres.

Best Practices und Einschränkungen

Wir empfehlen, die Maske beim Bearbeiten eines Bildes zu erweitern. So lassen sich die Ränder einer Bearbeitung glätten und sie wirkt überzeugender. Im Allgemeinen wird ein Erweiterungswert von 1% oder 2% empfohlen (0.01 oder 0.02).


Feedback geben zu Firebase AI Logic