Skip to content

Commit 3b4e977

Browse files
author
David Motsonashvili
committed
add outpainting example
1 parent 26d799f commit 3b4e977

File tree

4 files changed

+42
-17
lines changed

4 files changed

+42
-17
lines changed

firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/FirebaseAISamples.kt

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package com.google.firebase.quickstart.ai
22

33
import android.graphics.Bitmap
4+
import com.google.firebase.ai.ImagenModel
5+
import com.google.firebase.ai.type.Dimensions
46
import com.google.firebase.ai.type.FunctionDeclaration
57
import com.google.firebase.ai.type.GenerativeBackend
68
import com.google.firebase.ai.type.ImagenBackgroundMask
9+
import com.google.firebase.ai.type.ImagenEditMode
10+
import com.google.firebase.ai.type.ImagenEditingConfig
11+
import com.google.firebase.ai.type.ImagenMaskReference
712
import com.google.firebase.ai.type.ImagenRawImage
813
import com.google.firebase.ai.type.PublicPreviewAPI
914
import com.google.firebase.ai.type.ResponseModality
@@ -152,9 +157,35 @@ val FIREBASE_AI_SAMPLES = listOf(
152157
)
153158
},
154159
includeAttach = true,
155-
bundleReferenceImages = {string: String, bitmap: Bitmap? ->
156-
listOf(ImagenRawImage(bitmap!!.toImagenInlineImage()), ImagenBackgroundMask())
157-
}
160+
generateImages = { model: ImagenModel, inputText: String, bitmap: Bitmap? ->
161+
model.editImage(
162+
listOf(ImagenRawImage(bitmap!!.toImagenInlineImage()), ImagenBackgroundMask()),
163+
inputText,
164+
ImagenEditingConfig(ImagenEditMode.INPAINT_INSERTION)
165+
)
166+
}
167+
),
168+
Sample(
169+
title = "Imagen 3 - Outpainting",
170+
description = "Expand an image by drawing in more background",
171+
modelName= "imagen-3.0-capability-001",
172+
backend = GenerativeBackend.vertexAI(),
173+
navRoute = "imagen",
174+
categories = listOf(Category.IMAGE),
175+
initialPrompt = content {
176+
text(
177+
""
178+
)
179+
},
180+
includeAttach = true,
181+
generateImages = { model: ImagenModel, inputText: String, bitmap: Bitmap? ->
182+
val dimensions = Dimensions(bitmap!!.width * 2, bitmap.height * 2)
183+
model.editImage(
184+
ImagenMaskReference.generateMaskAndPadForOutpainting(bitmap.toImagenInlineImage(), dimensions),
185+
inputText,
186+
ImagenEditingConfig(ImagenEditMode.OUTPAINT)
187+
)
188+
}
158189
),
159190
Sample(
160191
title = "Gemini 2.0 Flash - image generation",

firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenScreen.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,7 @@ fun ImagenScreen(
102102
}
103103
TextButton(
104104
onClick = {
105-
if (imagenPrompt.isNotBlank()) {
106-
imagenViewModel.generateImages(imagenPrompt)
107-
}
105+
imagenViewModel.generateImages(imagenPrompt)
108106
},
109107
modifier = Modifier
110108
.padding(end = 16.dp, bottom = 16.dp)

firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/media/imagen/ImagenViewModel.kt

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import androidx.navigation.toRoute
99
import com.google.firebase.Firebase
1010
import com.google.firebase.ai.ImagenModel
1111
import com.google.firebase.ai.ai
12-
import com.google.firebase.ai.type.GenerativeBackend
1312
import com.google.firebase.ai.type.ImagenAspectRatio
1413
import com.google.firebase.ai.type.ImagenEditMode
1514
import com.google.firebase.ai.type.ImagenEditingConfig
@@ -52,7 +51,6 @@ class ImagenViewModel(
5251
init {
5352
val config = imagenGenerationConfig {
5453
numberOfImages = 4
55-
aspectRatio = ImagenAspectRatio.SQUARE_1x1
5654
imageFormat = ImagenImageFormat.png()
5755
}
5856
val settings = ImagenSafetySettings(
@@ -73,17 +71,13 @@ class ImagenViewModel(
7371
viewModelScope.launch {
7472
_isLoading.value = true
7573
try {
76-
val bundleReferenceImages = sample.bundleReferenceImages
77-
val imageResponse = if (bundleReferenceImages == null) {
74+
val generateImages = sample.generateImages
75+
val imageResponse = if (generateImages == null) {
7876
imagenModel.generateImages(
7977
inputText
8078
)
8179
} else {
82-
imagenModel.editImage(
83-
bundleReferenceImages(inputText, attachedImage),
84-
inputText,
85-
ImagenEditingConfig(ImagenEditMode.INPAINT_INSERTION)
86-
)
80+
generateImages(imagenModel, inputText, attachedImage)
8781
}
8882
_generatedBitmaps.value = imageResponse.images.map { it.asBitmap() }
8983
_errorMessage.value = null // clear error message

firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/ui/navigation/Sample.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.google.firebase.quickstart.ai.ui.navigation
22

33
import android.graphics.Bitmap
4+
import com.google.firebase.ai.ImagenModel
45
import com.google.firebase.ai.type.Content
56
import com.google.firebase.ai.type.GenerationConfig
67
import com.google.firebase.ai.type.GenerativeBackend
7-
import com.google.firebase.ai.type.ImagenReferenceImage
8+
import com.google.firebase.ai.type.ImagenGenerationResponse
9+
import com.google.firebase.ai.type.ImagenInlineImage
810
import com.google.firebase.ai.type.PublicPreviewAPI
911
import com.google.firebase.ai.type.Tool
1012
import java.util.UUID
@@ -36,5 +38,5 @@ data class Sample(
3638
val chatHistory: List<Content> = emptyList(),
3739
val tools: List<Tool>? = null,
3840
val includeAttach: Boolean = false,
39-
val bundleReferenceImages: ((String, Bitmap?) -> List<ImagenReferenceImage>)? = null
41+
val generateImages: (suspend (ImagenModel, String, Bitmap?) -> ImagenGenerationResponse<ImagenInlineImage>)? = null
4042
)

0 commit comments

Comments
 (0)