Skip to content

Commit bcc00a5

Browse files
davidmotsonDavid Motsonashvili
andauthored
Imagen Editing (#7075)
Adds Imagen Editing controls which allows for inpainting, outpainting, style transfer, subject references, and controlnet features. --------- Co-authored-by: David Motsonashvili <davidmotson@google.com>
1 parent ae14842 commit bcc00a5

22 files changed

+1211
-12
lines changed

firebase-ai/CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Unreleased
2-
2+
* [feature] added support for Imagen Editing, including inpainting, outpainting, control, style
3+
transfer, and subject references (#7075)
34

45
# 17.0.0
56
* [feature] Added support for configuring the "thinking" budget when using Gemini

firebase-ai/api.txt

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,10 @@ package com.google.firebase.ai {
6868
}
6969

7070
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenModel {
71+
method public suspend Object? editImage(java.util.List<? extends com.google.firebase.ai.type.ImagenReferenceImage> referenceImages, String prompt, com.google.firebase.ai.type.ImagenEditingConfig? config = null, kotlin.coroutines.Continuation<? super com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>>);
7172
method public suspend Object? generateImages(String prompt, kotlin.coroutines.Continuation<? super com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>>);
73+
method public suspend Object? inpaintImage(com.google.firebase.ai.type.ImagenInlineImage image, String prompt, com.google.firebase.ai.type.ImagenMaskReference mask, com.google.firebase.ai.type.ImagenEditingConfig config, kotlin.coroutines.Continuation<? super com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>>);
74+
method public suspend Object? outpaintImage(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions, com.google.firebase.ai.type.ImagenImagePlacement newPosition = com.google.firebase.ai.type.ImagenImagePlacement.CENTER, String prompt = "", com.google.firebase.ai.type.ImagenEditingConfig? config = null, kotlin.coroutines.Continuation<? super com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>>);
7275
}
7376

7477
@com.google.firebase.ai.type.PublicPreviewAPI public final class LiveGenerativeModel {
@@ -107,9 +110,13 @@ package com.google.firebase.ai.java {
107110
}
108111

109112
@com.google.firebase.ai.type.PublicPreviewAPI public abstract class ImagenModelFutures {
113+
method public abstract com.google.common.util.concurrent.ListenableFuture<com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>> editImage(java.util.List<? extends com.google.firebase.ai.type.ImagenReferenceImage> referenceImages, String prompt);
114+
method public abstract com.google.common.util.concurrent.ListenableFuture<com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>> editImage(java.util.List<? extends com.google.firebase.ai.type.ImagenReferenceImage> referenceImages, String prompt, com.google.firebase.ai.type.ImagenEditingConfig? config = null);
110115
method public static final com.google.firebase.ai.java.ImagenModelFutures from(com.google.firebase.ai.ImagenModel model);
111116
method public abstract com.google.common.util.concurrent.ListenableFuture<com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>> generateImages(String prompt);
112117
method public abstract com.google.firebase.ai.ImagenModel getImageModel();
118+
method public abstract com.google.common.util.concurrent.ListenableFuture<com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>> inpaintImage(com.google.firebase.ai.type.ImagenInlineImage image, String prompt, com.google.firebase.ai.type.ImagenMaskReference mask, com.google.firebase.ai.type.ImagenEditingConfig config);
119+
method public abstract com.google.common.util.concurrent.ListenableFuture<com.google.firebase.ai.type.ImagenGenerationResponse<com.google.firebase.ai.type.ImagenInlineImage>> outpaintImage(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions, com.google.firebase.ai.type.ImagenImagePlacement newPosition = com.google.firebase.ai.type.ImagenImagePlacement.CENTER, String prompt = "", com.google.firebase.ai.type.ImagenEditingConfig? config = null);
113120
field public static final com.google.firebase.ai.java.ImagenModelFutures.Companion Companion;
114121
}
115122

@@ -262,6 +269,14 @@ package com.google.firebase.ai.type {
262269
property public final int totalTokens;
263270
}
264271

272+
public final class Dimensions {
273+
ctor public Dimensions(int width, int height);
274+
method public int getHeight();
275+
method public int getWidth();
276+
property public final int height;
277+
property public final int width;
278+
}
279+
265280
public final class FileDataPart implements com.google.firebase.ai.type.Part {
266281
ctor public FileDataPart(String uri, String mimeType);
267282
method public String getMimeType();
@@ -533,6 +548,43 @@ package com.google.firebase.ai.type {
533548
public static final class ImagenAspectRatio.Companion {
534549
}
535550

551+
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenBackgroundMask extends com.google.firebase.ai.type.ImagenMaskReference {
552+
ctor public ImagenBackgroundMask(Double? dilation = null);
553+
}
554+
555+
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenControlReference extends com.google.firebase.ai.type.ImagenReferenceImage {
556+
ctor public ImagenControlReference(com.google.firebase.ai.type.ImagenControlType type, com.google.firebase.ai.type.ImagenInlineImage? image = null, Integer? referenceId = null, Boolean? enableComputation = null, Integer? superpixelRegionSize = null, Integer? superpixelRuler = null);
557+
}
558+
559+
public final class ImagenControlType {
560+
field public static final com.google.firebase.ai.type.ImagenControlType CANNY;
561+
field public static final com.google.firebase.ai.type.ImagenControlType COLOR_SUPERPIXEL;
562+
field public static final com.google.firebase.ai.type.ImagenControlType.Companion Companion;
563+
field public static final com.google.firebase.ai.type.ImagenControlType FACE_MESH;
564+
field public static final com.google.firebase.ai.type.ImagenControlType SCRIBBLE;
565+
}
566+
567+
public static final class ImagenControlType.Companion {
568+
}
569+
570+
public final class ImagenEditMode {
571+
field public static final com.google.firebase.ai.type.ImagenEditMode.Companion Companion;
572+
field public static final com.google.firebase.ai.type.ImagenEditMode INPAINT_INSERTION;
573+
field public static final com.google.firebase.ai.type.ImagenEditMode INPAINT_REMOVAL;
574+
field public static final com.google.firebase.ai.type.ImagenEditMode OUTPAINT;
575+
}
576+
577+
public static final class ImagenEditMode.Companion {
578+
}
579+
580+
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenEditingConfig {
581+
ctor public ImagenEditingConfig(com.google.firebase.ai.type.ImagenEditMode? editMode = null, Integer? editSteps = null);
582+
}
583+
584+
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenForegroundMask extends com.google.firebase.ai.type.ImagenMaskReference {
585+
ctor public ImagenForegroundMask(Double? dilation = null);
586+
}
587+
536588
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenGenerationConfig {
537589
ctor public ImagenGenerationConfig(String? negativePrompt = null, Integer? numberOfImages = 1, com.google.firebase.ai.type.ImagenAspectRatio? aspectRatio = null, com.google.firebase.ai.type.ImagenImageFormat? imageFormat = null, Boolean? addWatermark = null);
538590
method public Boolean? getAddWatermark();
@@ -593,6 +645,28 @@ package com.google.firebase.ai.type {
593645
method public com.google.firebase.ai.type.ImagenImageFormat png();
594646
}
595647

648+
public final class ImagenImagePlacement {
649+
method public static com.google.firebase.ai.type.ImagenImagePlacement fromCoordinate(int x, int y);
650+
method public Integer? getX();
651+
method public Integer? getY();
652+
property public final Integer? x;
653+
property public final Integer? y;
654+
field public static final com.google.firebase.ai.type.ImagenImagePlacement BOTTOM_CENTER;
655+
field public static final com.google.firebase.ai.type.ImagenImagePlacement BOTTOM_LEFT;
656+
field public static final com.google.firebase.ai.type.ImagenImagePlacement BOTTOM_RIGHT;
657+
field public static final com.google.firebase.ai.type.ImagenImagePlacement CENTER;
658+
field public static final com.google.firebase.ai.type.ImagenImagePlacement.Companion Companion;
659+
field public static final com.google.firebase.ai.type.ImagenImagePlacement LEFT_CENTER;
660+
field public static final com.google.firebase.ai.type.ImagenImagePlacement RIGHT_CENTER;
661+
field public static final com.google.firebase.ai.type.ImagenImagePlacement TOP_CENTER;
662+
field public static final com.google.firebase.ai.type.ImagenImagePlacement TOP_LEFT;
663+
field public static final com.google.firebase.ai.type.ImagenImagePlacement TOP_RIGHT;
664+
}
665+
666+
public static final class ImagenImagePlacement.Companion {
667+
method public com.google.firebase.ai.type.ImagenImagePlacement fromCoordinate(int x, int y);
668+
}
669+
596670
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenInlineImage {
597671
method public android.graphics.Bitmap asBitmap();
598672
method public byte[] getData();
@@ -601,6 +675,21 @@ package com.google.firebase.ai.type {
601675
property public final String mimeType;
602676
}
603677

678+
public final class ImagenInlineImageKt {
679+
method @com.google.firebase.ai.type.PublicPreviewAPI public static com.google.firebase.ai.type.ImagenInlineImage toImagenInlineImage(android.graphics.Bitmap);
680+
}
681+
682+
@com.google.firebase.ai.type.PublicPreviewAPI public abstract class ImagenMaskReference extends com.google.firebase.ai.type.ImagenReferenceImage {
683+
method public static final java.util.List<com.google.firebase.ai.type.ImagenReferenceImage> generateMaskAndPadForOutpainting(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions);
684+
method public static final java.util.List<com.google.firebase.ai.type.ImagenReferenceImage> generateMaskAndPadForOutpainting(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions, com.google.firebase.ai.type.ImagenImagePlacement newPosition = com.google.firebase.ai.type.ImagenImagePlacement.CENTER);
685+
field public static final com.google.firebase.ai.type.ImagenMaskReference.Companion Companion;
686+
}
687+
688+
public static final class ImagenMaskReference.Companion {
689+
method public java.util.List<com.google.firebase.ai.type.ImagenReferenceImage> generateMaskAndPadForOutpainting(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions);
690+
method public java.util.List<com.google.firebase.ai.type.ImagenReferenceImage> generateMaskAndPadForOutpainting(com.google.firebase.ai.type.ImagenInlineImage image, com.google.firebase.ai.type.Dimensions newDimensions, com.google.firebase.ai.type.ImagenImagePlacement newPosition = com.google.firebase.ai.type.ImagenImagePlacement.CENTER);
691+
}
692+
604693
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenPersonFilterLevel {
605694
field public static final com.google.firebase.ai.type.ImagenPersonFilterLevel ALLOW_ADULT;
606695
field public static final com.google.firebase.ai.type.ImagenPersonFilterLevel ALLOW_ALL;
@@ -611,6 +700,21 @@ package com.google.firebase.ai.type {
611700
public static final class ImagenPersonFilterLevel.Companion {
612701
}
613702

703+
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenRawImage extends com.google.firebase.ai.type.ImagenReferenceImage {
704+
ctor public ImagenRawImage(com.google.firebase.ai.type.ImagenInlineImage image);
705+
}
706+
707+
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenRawMask extends com.google.firebase.ai.type.ImagenMaskReference {
708+
ctor public ImagenRawMask(com.google.firebase.ai.type.ImagenInlineImage mask, Double? dilation = null);
709+
}
710+
711+
@com.google.firebase.ai.type.PublicPreviewAPI public abstract class ImagenReferenceImage {
712+
method public final com.google.firebase.ai.type.ImagenInlineImage? getImage();
713+
method public final Integer? getReferenceId();
714+
property public final com.google.firebase.ai.type.ImagenInlineImage? image;
715+
property public final Integer? referenceId;
716+
}
717+
614718
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenSafetyFilterLevel {
615719
field public static final com.google.firebase.ai.type.ImagenSafetyFilterLevel BLOCK_LOW_AND_ABOVE;
616720
field public static final com.google.firebase.ai.type.ImagenSafetyFilterLevel BLOCK_MEDIUM_AND_ABOVE;
@@ -626,6 +730,28 @@ package com.google.firebase.ai.type {
626730
ctor public ImagenSafetySettings(com.google.firebase.ai.type.ImagenSafetyFilterLevel safetyFilterLevel, com.google.firebase.ai.type.ImagenPersonFilterLevel personFilterLevel);
627731
}
628732

733+
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenSemanticMask extends com.google.firebase.ai.type.ImagenMaskReference {
734+
ctor public ImagenSemanticMask(java.util.List<java.lang.Integer> classes, Double? dilation = null);
735+
}
736+
737+
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenStyleReference extends com.google.firebase.ai.type.ImagenReferenceImage {
738+
ctor public ImagenStyleReference(com.google.firebase.ai.type.ImagenInlineImage image, Integer? referenceId = null, String? description = null);
739+
}
740+
741+
@com.google.firebase.ai.type.PublicPreviewAPI public final class ImagenSubjectReference extends com.google.firebase.ai.type.ImagenReferenceImage {
742+
ctor public ImagenSubjectReference(com.google.firebase.ai.type.ImagenInlineImage image, Integer? referenceId = null, String? description = null, com.google.firebase.ai.type.ImagenSubjectReferenceType? subjectType = null);
743+
}
744+
745+
public final class ImagenSubjectReferenceType {
746+
field public static final com.google.firebase.ai.type.ImagenSubjectReferenceType ANIMAL;
747+
field public static final com.google.firebase.ai.type.ImagenSubjectReferenceType.Companion Companion;
748+
field public static final com.google.firebase.ai.type.ImagenSubjectReferenceType PERSON;
749+
field public static final com.google.firebase.ai.type.ImagenSubjectReferenceType PRODUCT;
750+
}
751+
752+
public static final class ImagenSubjectReferenceType.Companion {
753+
}
754+
629755
public final class InlineDataPart implements com.google.firebase.ai.type.Part {
630756
ctor public InlineDataPart(byte[] inlineData, String mimeType);
631757
method public byte[] getInlineData();

firebase-ai/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
version=17.0.1
15+
version=17.1.0
1616
latestReleasedVersion=17.0.0
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright 2025 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.google.firebase.ai
17+
18+
import com.google.firebase.ai.AIModels.Companion.app
19+
import com.google.firebase.ai.type.ImagenBackgroundMask
20+
import com.google.firebase.ai.type.ImagenEditMode
21+
import com.google.firebase.ai.type.ImagenEditingConfig
22+
import com.google.firebase.ai.type.ImagenRawImage
23+
import com.google.firebase.ai.type.PublicPreviewAPI
24+
import kotlinx.coroutines.runBlocking
25+
import org.junit.Test
26+
27+
@OptIn(PublicPreviewAPI::class)
28+
class ImagenTests {
29+
@Test
30+
fun testGenerateAndEditImage() {
31+
val imageGenerationModel = FirebaseAI.getInstance(app()).imagenModel("imagen-3.0-generate-002")
32+
val imageEditingModel = FirebaseAI.getInstance(app()).imagenModel("imagen-3.0-capability-001")
33+
34+
runBlocking {
35+
val catImage = imageGenerationModel.generateImages("A cat").images.first()
36+
val editedCatImage =
37+
imageEditingModel.editImage(
38+
listOf(ImagenRawImage(catImage), ImagenBackgroundMask()),
39+
"A cat flying through space",
40+
ImagenEditingConfig(ImagenEditMode.INPAINT_INSERTION)
41+
)
42+
assert(editedCatImage.images.size == 1)
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)