Nesta página, descrevemos como usar o Imagen para substituir o plano de fundo de uma imagem usando os SDKs do Firebase AI Logic.
A substituição de plano de fundo é um tipo de edição baseada em máscara (especificamente inpainting). Uma máscara é uma sobreposição digital que define a área específica que você quer editar.
Como funciona: você fornece uma imagem original e uma imagem mascarada correspondente que define uma máscara sobre o plano de fundo, usando a detecção automática de plano de fundo ou fornecendo a máscara do plano de fundo por conta própria. Você também pode dar um comando de texto descrevendo o que quer mudar. Em seguida, o modelo gera e aplica um novo plano de fundo.
Por exemplo, é possível mudar a configuração ao redor de um assunto ou objeto sem afetar o primeiro plano (por exemplo, em uma imagem de produto).
Ir para o código do plano de fundo detectado automaticamente Ir para o código para fornecer a máscara de plano de fundo
Antes de começar
Disponível apenas quando você usa o Vertex AI Gemini API como provedor de API. |
Se ainda não tiver feito isso, conclua o
guia de primeiros passos, que
descreve como configurar seu projeto do Firebase, conectar seu app ao Firebase,
adicionar o SDK, inicializar o serviço de back-end para o provedor de API escolhido e
criar uma instância de ImagenModel
.
Modelos compatíveis com esse recurso
O Imagen oferece edição de imagens com o modelo capability
:
imagen-3.0-capability-001
Para modelos Imagen, o local global
não é compatível.
Substituir o plano de fundo usando a detecção automática
Antes de testar esta amostra, conclua a seção Antes de começar deste guia para configurar seu projeto e app. |
O exemplo a seguir mostra como substituir o plano de fundo de uma imagem usando a detecção automática. Você fornece a imagem original e um comando de texto, e o Imagen detecta e cria automaticamente uma máscara do plano de fundo para modificar a imagem original.
Swift
A edição de imagens com modelos Imagen não é compatível com Swift. Volte mais tarde este ano!
Kotlin
Para substituir o plano de fundo usando a detecção automática, especifique
ImagenBackgroundMask
. Use
editImage()
e defina a configuração de edição para usar ImagenEditMode.INPAINT_INSERTION
.
// 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 new background.
val prompt = "space background"
// Use the editImage API to replace the background.
// Pass the original image, the prompt, and an editing configuration.
val editedImage = model.editImage(
sources = listOf(
ImagenRawImage(originalImage),
ImagenBackgroundMask(), // Use ImagenBackgroundMask() to auto-generate the mask.
),
prompt = prompt,
// Define the editing configuration for inpainting and background replacement.
config = ImagenEditingConfig(ImagenEditMode.INPAINT_INSERTION)
)
// Process the resulting 'editedImage' Bitmap, for example, by displaying it in an ImageView.
}
Java
Para substituir o plano de fundo usando a detecção automática, especifique
ImagenBackgroundMask
. Use
editImage()
e defina a configuração de edição para usar ImagenEditMode.INPAINT_INSERTION
.
// 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 new background.
String prompt = "space background";
// Define the list of sources for the editImage call.
// This includes the original image and the auto-generated mask.
ImagenRawImage rawOriginalImage = new ImagenRawImage(originalImage);
ImagenBackgroundMask rawMaskedImage = new ImagenBackgroundMask(); // Use ImagenBackgroundMask() to auto-generate the mask.
// Define the editing configuration for inpainting and insertion.
ImagenEditingConfig config = new ImagenEditingConfig.Builder()
.setEditMode(ImagenEditMode.INPAINT_INSERTION)
.build();
// Use the editImage API to replace the background.
// 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 = 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
A edição de imagens com modelos Imagen não está disponível para apps da Web. Volte mais tarde este ano!
Dart
Para substituir o plano de fundo usando a detecção automática, especifique
ImagenBackgroundMask
. Use
editImage()
e defina a configuração de edição para usar ImagenEditMode.inpaintInsertion
.
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 new background.
final prompt = 'space background';
try {
// Use the editImage API to replace the background.
// 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 background replacement.
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');
}
Unity
A edição de imagens com modelos Imagen não é compatível com o Unity. Volte mais tarde este ano!
Substituir o plano de fundo usando uma máscara fornecida
Antes de testar esta amostra, conclua a seção Antes de começar deste guia para configurar seu projeto e app. |
O exemplo a seguir mostra como substituir o plano de fundo de uma imagem usando uma máscara de plano de fundo definida em uma imagem fornecida por você. Você fornece a imagem original, um comando de texto e a imagem mascarada.
Swift
A edição de imagens com modelos Imagen não é compatível com Swift. Volte mais tarde este ano!
Kotlin
Para substituir o plano de fundo usando uma máscara fornecida por você, especifique
ImagenRawMask
com a imagem mascarada. Use
editImage()
e defina a configuração de edição para usar ImagenEditMode.INPAINT_INSERTION
.
// 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 new background.
val prompt = "space background"
// Use the editImage API to replace the background.
// 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 background replacement.
config = ImagenEditingConfig(ImagenEditMode.INPAINT_INSERTION)
)
// Process the resulting 'editedImage' Bitmap, for example, by displaying it in an ImageView.
}
Java
Para substituir o plano de fundo usando uma máscara fornecida por você, especifique
ImagenRawMask
com a imagem mascarada. Use
editImage()
e defina a configuração de edição para usar ImagenEditMode.INPAINT_INSERTION
.
// 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 new background.
String prompt = "space background";
// Define the list of source images for the editImage call.
ImagenRawImage rawOriginalImage = new ImagenRawImage(originalImage);
ImagenBackgroundMask rawMaskedImage = new ImagenRawMask(maskImage); // Use ImagenRawMask() to provide your own masked image.
// Define the editing configuration for inpainting and background replacement.
ImagenEditingConfig config = new ImagenEditingConfig.Builder()
.setEditMode(ImagenEditMode.INPAINT_INSERTION)
.build();
// Use the editImage API to replace the background.
// 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 = 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
A edição de imagens com modelos Imagen não está disponível para apps da Web. Volte mais tarde este ano!
Dart
Para substituir o plano de fundo usando uma máscara fornecida por você, especifique
ImagenRawMask
com a imagem mascarada. Use
editImage()
e defina a configuração de edição para usar ImagenEditMode.INPAINT_INSERTION
.
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 new background.
final prompt = 'space background';
try {
// Use the editImage API to replace the background.
// 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 background replacement.
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');
}
Unity
A edição de imagens com modelos Imagen não é compatível com o Unity. Volte mais tarde este ano!
Práticas recomendadas e limitações
Recomendamos dilatar a máscara ao editar uma imagem. Isso ajuda a suavizar as bordas de uma edição e a tornar a mudança mais convincente. Em geral, é recomendável um valor de dilatação de 1% ou 2% (0.01
ou 0.02
).
Enviar feedback sobre sua experiência com Firebase AI Logic