@@ -51,7 +51,6 @@ import androidx.compose.ui.layout.ContentScale
5151import com.google.firebase.Firebase
5252import com.google.firebase.ai.ImagenModel
5353import com.google.firebase.ai.ai
54- import com.google.firebase.ai.type.Dimension
5554import com.google.firebase.ai.type.Dimensions
5655import com.google.firebase.ai.type.GenerativeBackend
5756import com.google.firebase.ai.type.ImagenAspectRatio
@@ -83,12 +82,12 @@ import androidx.compose.ui.graphics.Color as ComposeColor
8382
8483private object ImagenModelConfiguration {
8584 // [START android_imagen_model_configuration]
86- val config = ImagenGenerationConfig {
87- numberOfImages = 2
88- aspectRatio = ImagenAspectRatio .LANDSCAPE_16x9
89- imageFormat = ImagenImageFormat .jpeg(compressionQuality = 100 )
90- addWatermark = false
91- }
85+ val config = ImagenGenerationConfig (
86+ numberOfImages = 2 ,
87+ aspectRatio = ImagenAspectRatio .LANDSCAPE_16x9 ,
88+ imageFormat = ImagenImageFormat .jpeg(compressionQuality = 100 ),
89+ addWatermark = false ,
90+ )
9291
9392 // Initialize the Gemini Developer API backend service
9493 // For Vertex AI use Firebase.ai(backend = GenerativeBackend.vertexAI())
@@ -98,7 +97,7 @@ private object ImagenModelConfiguration {
9897 safetySettings = ImagenSafetySettings (
9998 safetyFilterLevel = ImagenSafetyFilterLevel .BLOCK_LOW_AND_ABOVE ,
10099 personFilterLevel = ImagenPersonFilterLevel .BLOCK_ALL
101- )
100+ ),
102101 )
103102 // [END android_imagen_model_configuration]
104103}
@@ -117,7 +116,7 @@ private fun generateImagesWithImagen(scope: CoroutineScope) {
117116 val imageResponse = model.generateImages(
118117 prompt = " A hyper realistic picture of a t-rex with a blue bagpack in a prehistoric forest" ,
119118 )
120- val image = imageResponse.images.first
119+ val image = imageResponse.images.first()
121120 val bitmapImage = image.asBitmap()
122121 // [END android_imagen_generate_images]
123122 }
@@ -133,29 +132,32 @@ suspend fun insertFlowersIntoImage(
133132
134133 // Pass the original image, a mask, the prompt, and an editing configuration.
135134 val editedImage = model.editImage(
136- sources = listOf (
137- ImagenRawImage (originalImage),
138- mask
135+ referenceImages = listOf (
136+ ImagenRawImage (originalImage.toImagenInlineImage() ),
137+ mask,
139138 ),
140139 prompt = prompt,
141140 // Define the editing configuration for inpainting and insertion.
142141 config = ImagenEditingConfig (ImagenEditMode .INPAINT_INSERTION )
143142 )
144-
145143 return editedImage
146144}
147145// [END android_imagen_inpaint_insertion]
148146
149147// [START android_imagen_inpaint_removal]
150- suspend fun removeBallFromImage (model : ImagenModel , originalImage : Bitmap , mask : ImagenMaskReference ): ImagenGenerationResponse <ImagenInlineImage > {
148+ suspend fun removeBallFromImage (
149+ model : ImagenModel ,
150+ originalImage : Bitmap ,
151+ mask : ImagenMaskReference
152+ ): ImagenGenerationResponse <ImagenInlineImage > {
151153
152154 // Optional: provide the prompt describing the content to be removed.
153155 val prompt = " a ball"
154156
155157 // Pass the original image, a mask, the prompt, and an editing configuration.
156158 val editedImage = model.editImage(
157- sources = listOf (
158- ImagenRawImage (originalImage),
159+ referenceImages = listOf (
160+ ImagenRawImage (originalImage.toImagenInlineImage() ),
159161 mask
160162 ),
161163 prompt = prompt,
@@ -168,7 +170,6 @@ suspend fun removeBallFromImage(model: ImagenModel, originalImage: Bitmap, mask:
168170// [END android_imagen_inpaint_removal]
169171
170172// [START android_imagen_editing_mask_editor]
171-
172173@Composable
173174fun ImagenEditingMaskEditor (
174175 sourceBitmap : Bitmap ,
@@ -248,7 +249,7 @@ fun ImagenEditingMaskEditor(
248249 }
249250 Button (
250251 onClick = {
251- val maskBitmap = createMask (sourceBitmap, paths)
252+ val maskBitmap = createMaskBitmap (sourceBitmap, paths)
252253 onMaskFinalized(maskBitmap)
253254 },
254255 ) {
@@ -263,7 +264,7 @@ private fun createMaskBitmap(
263264 sourceBitmap : Bitmap ,
264265 paths : SnapshotStateList <Path >,
265266): Bitmap {
266- val maskBitmap = createBitmap(sourceBitmap.width, sourceBitmap.height)
267+ val maskBitmap = Bitmap . createBitmap(sourceBitmap.width, sourceBitmap.height, Bitmap . Config . ARGB_8888 )
267268 val canvas = android.graphics.Canvas (maskBitmap)
268269 val paint = Paint ().apply {
269270 color = AndroidColor .RED
@@ -285,9 +286,9 @@ suspend fun expandImage(originalImage: Bitmap, imagenModel: ImagenModel): Imagen
285286 // Optionally describe what should appear in the expanded area.
286287 val prompt = " a sprawling sandy beach next to the ocean"
287288
288- val editedImage = model .outpaintImage(
289- ImagenRawImage ( originalImage),
290- Dimension (width, height ),
289+ val editedImage = imagenModel .outpaintImage(
290+ originalImage.toImagenInlineImage( ),
291+ Dimensions ( 1024 , 1024 ),
291292 prompt = prompt,
292293 newPosition = ImagenImagePlacement .LEFT_CENTER
293294 )
@@ -304,8 +305,8 @@ suspend fun replaceBackground(model: ImagenModel, originalImage: Bitmap): Imagen
304305
305306 // Pass the original image, a mask, the prompt, and an editing configuration.
306307 val editedImage = model.editImage(
307- sources = listOf (
308- ImagenRawImage (originalImage),
308+ referenceImages = listOf (
309+ ImagenRawImage (originalImage.toImagenInlineImage() ),
309310 ImagenBackgroundMask (),
310311 ),
311312 prompt = prompt,
@@ -321,8 +322,8 @@ suspend fun customizeCatImage(model: ImagenModel, referenceCatImage: Bitmap): Im
321322
322323 // Define the subject reference using the reference image.
323324 val subjectReference = ImagenSubjectReference (
324- image = referenceCatImage,
325- referenceID = 1 ,
325+ image = referenceCatImage.toImagenInlineImage() ,
326+ referenceId = 1 ,
326327 description = " cat" ,
327328 subjectType = ImagenSubjectReferenceType .ANIMAL
328329 )
@@ -333,7 +334,7 @@ suspend fun customizeCatImage(model: ImagenModel, referenceCatImage: Bitmap): Im
333334
334335 // Use the editImage API to perform the subject customization.
335336 val editedImage = model.editImage(
336- references = listOf (subjectReference),
337+ referenceImages = listOf (subjectReference),
337338 prompt = prompt,
338339 config = ImagenEditingConfig (
339340 editSteps = 50 // Number of editing steps, a higher value can improve quality
@@ -345,23 +346,23 @@ suspend fun customizeCatImage(model: ImagenModel, referenceCatImage: Bitmap): Im
345346// [END android_imagen_customize_subject]
346347
347348// [START android_imagen_customize_control]
348- suspend fun customizeCatImageByControl (model : ImagenModel , referenceCatImage : Bitmap ): ImagenGenerationResponse <ImagenInlineImage > {
349+ suspend fun customizeCatImageByControl (model : ImagenModel , referenceImage : Bitmap ): ImagenGenerationResponse <ImagenInlineImage > {
349350
350351 // Define the subject reference using the reference image.
351352 val controlReference = ImagenControlReference (
352- image = referenceImage,
353- referenceID = 1 ,
354- controlType = CONTROL_TYPE_SCRIBBLE
353+ image = referenceImage.toImagenInlineImage() ,
354+ referenceId = 1 ,
355+ type = ImagenControlType . SCRIBBLE ,
355356 )
356357
357358 val prompt = " A cat flying through outer space arranged like the scribble map[1]"
358359
359360 val editedImage = model.editImage(
360- references = listOf (controlReference),
361+ referenceImages = listOf (controlReference),
361362 prompt = prompt,
362363 config = ImagenEditingConfig (
363364 editSteps = 50
364- )
365+ ),
365366 )
366367
367368 return editedImage
@@ -373,8 +374,8 @@ suspend fun customizeImageByStyle(model: ImagenModel, referenceVanGoghImage: Bit
373374
374375 // Define the style reference using the reference image.
375376 val styleReference = ImagenStyleReference (
376- image = referenceVanGoghImage,
377- referenceID = 1 ,
377+ image = referenceVanGoghImage.toImagenInlineImage() ,
378+ referenceId = 1 ,
378379 description = " Van Gogh style"
379380 )
380381
@@ -384,11 +385,11 @@ suspend fun customizeImageByStyle(model: ImagenModel, referenceVanGoghImage: Bit
384385
385386 // Use the editImage API to perform the style customization.
386387 val editedImage = model.editImage(
387- references = listOf (styleReference),
388+ referenceImages = listOf (styleReference),
388389 prompt = prompt,
389390 config = ImagenEditingConfig (
390391 editSteps = 50 // Number of editing steps, a higher value can improve quality
391- )
392+ ),
392393 )
393394
394395 return editedImage
0 commit comments