ইমাজেন একটি ইমেজ জেনারেশন মডেল। এটি ব্যবহারকারীর প্রোফাইলের জন্য কাস্টম অবতার তৈরি করতে বা ব্যবহারকারীর ব্যস্ততা বাড়াতে বিদ্যমান স্ক্রিন ফ্লোতে ব্যক্তিগতকৃত ভিজ্যুয়াল সম্পদ সংহত করতে ব্যবহার করা যেতে পারে।
আপনি Firebase AI Logic SDK ব্যবহার করে আপনার Android অ্যাপ থেকে Imagen মডেলগুলি অ্যাক্সেস করতে পারেন। Imagen মডেলগুলি Firebase AI Logic API প্রদানকারী উভয় ব্যবহার করেই উপলব্ধ: Gemini Developer API (অধিকাংশ ডেভেলপারদের জন্য প্রস্তাবিত) এবং Vertex AI।
প্রম্পট নিয়ে পরীক্ষা-নিরীক্ষা করুন
আদর্শ প্রম্পট তৈরি করতে প্রায়শই একাধিক প্রচেষ্টা করতে হয়। আপনি গুগল এআই স্টুডিওতে ইমেজ প্রম্পট নিয়ে পরীক্ষা করতে পারেন, যা প্রম্পট ডিজাইন এবং প্রোটোটাইপিংয়ের জন্য একটি IDE। আপনার প্রম্পটগুলি কীভাবে উন্নত করবেন সে সম্পর্কে টিপসের জন্য, প্রম্পট এবং ইমেজ অ্যাট্রিবিউট গাইডটি পর্যালোচনা করুন।

একটি Firebase প্রকল্প সেট আপ করুন এবং আপনার অ্যাপটি সংযুক্ত করুন
আপনার অ্যান্ড্রয়েড প্রজেক্টে Firebase যোগ করতে Firebase ডকুমেন্টেশনের ধাপগুলি অনুসরণ করুন।
গ্রেডল নির্ভরতা যোগ করুন
আপনার build.gradle
ফাইলে নিম্নলিখিত নির্ভরতা যোগ করুন:
dependencies {
// Import the BoM for the Firebase platform
implementation(platform("com.google.firebase:firebase-bom:34.4.0"))
// Add the dependency for the Firebase AI Logic library. When using the BoM,
// you don't specify versions in Firebase library dependencies
implementation("com.google.firebase:firebase-ai")
}
একটি ছবি তৈরি করুন
আপনার অ্যান্ড্রয়েড অ্যাপে একটি ছবি তৈরি করতে, একটি ঐচ্ছিক কনফিগারেশন সহ একটি ImagenModel
ইন্সট্যান্টিয়েট করে শুরু করুন।
আপনি generationConfig
প্যারামিটার ব্যবহার করে একটি নেতিবাচক প্রম্পট, ছবির সংখ্যা, আউটপুট ছবির আকৃতির অনুপাত, ছবির ফর্ম্যাট নির্ধারণ করতে পারেন এবং একটি ওয়াটারমার্ক যোগ করতে পারেন। আপনি নিরাপত্তা এবং ব্যক্তি ফিল্টার কনফিগার করতে safetySettings
প্যারামিটার ব্যবহার করতে পারেন।
কোটলিন
val config = ImagenGenerationConfig {
numberOfImages = 2,
aspectRatio = ImagenAspectRatio.LANDSCAPE_16x9,
imageFormat = ImagenImageFormat.jpeg(compressionQuality = 100),
addWatermark = false
}
// Initialize the Gemini Developer API backend service
// For Vertex AI use Firebase.ai(backend = GenerativeBackend.vertexAI())
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).imagenModel(
modelName = "imagen-4.0-generate-001",
generationConfig = config,
safetySettings = ImagenSafetySettings(
safetyFilterLevel = ImagenSafetyFilterLevel.BLOCK_LOW_AND_ABOVE,
personFilterLevel = ImagenPersonFilterLevel.BLOCK_ALL
)
)
জাভা
ImagenGenerationConfig config = new ImagenGenerationConfig.Builder()
.setNumberOfImages(2)
.setAspectRatio(ImagenAspectRatio.LANDSCAPE_16x9)
.setImageFormat(ImagenImageFormat.jpeg(100))
.setAddWatermark(false)
.build();
// For Vertex AI use Firebase.ai(backend = GenerativeBackend.vertexAI())
ImagenModelFutures model = ImagenModelFutures.from(
FirebaseAI.ai(backend = GenerativeBackend.googleAI()).imagenModel(
"imagen-4.0-generate-001",
config,
ImagenSafetySettings.builder()
.setSafetyFilterLevel(ImagenSafetyFilterLevel.BLOCK_LOW_AND_ABOVE)
.setPersonFilterLevel(ImagenPersonFilterLevel.BLOCK_ALL)
.build())
);
একবার আপনার ImagenModel
ইন্সট্যান্টিয়েটেড হয়ে গেলে, আপনি generateImages
এ কল করে ছবি তৈরি করতে পারেন:
কোটলিন
val imageResponse = model.generateImages(
prompt = "A hyper realistic picture of a t-rex with a blue bagpack in a prehistoric forest",
)
val image = imageResponse.images.first
val bitmapImage = image.asBitmap()
জাভা
CompletableFuture<GenerateContentResponse> futureResponse =
model.generateContent(
Content.newBuilder()
.addParts(
Part.newBuilder()
.setText("A hyper realistic picture of a t-rex with a blue bagpack in a prehistoric forest")
.build())
.build());
try {
GenerateContentResponse imageResponse = futureResponse.get();
List<GeneratedImage> images =
imageResponse
.getCandidates(0)
.getContent()
.getParts(0)
.getInlineData()
.getImagesList();
if (!images.isEmpty()) {
GeneratedImage image = images.get(0);
Bitmap bitmapImage = image.asBitmap();
// Use bitmapImage
}
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
Imagen দিয়ে ছবি সম্পাদনা করুন
ফায়ারবেস এআই লজিক এসডিকেগুলি ইমেজেন মডেলের মাধ্যমে উন্নত চিত্র সম্পাদনা ক্ষমতা প্রদান করে, যা আপনাকে এগুলি করার অনুমতি দেয়:
- মুখোশের উপর ভিত্তি করে ছবি সম্পাদনা করুন , যার মধ্যে বস্তু সন্নিবেশ করানো বা অপসারণ করা, ছবির বিষয়বস্তুকে তার মূল সীমানার বাইরে প্রসারিত করা এবং পটভূমি পরিবর্তন করার মতো কাজ অন্তর্ভুক্ত রয়েছে।
- নির্দিষ্ট স্টাইল (প্যাটার্ন, টেক্সচার, অথবা শিল্পীর স্টাইল) প্রয়োগের মাধ্যমে, বিভিন্ন বিষয়ের উপর ফোকাস করে (যেমন পণ্য, মানুষ, অথবা প্রাণী), অথবা বিভিন্ন নিয়ন্ত্রণ (যেমন হাতে আঁকা স্কেচ, একটি চতুর প্রান্তের ছবি, অথবা একটি মুখের জাল) মেনে ছবি কাস্টমাইজ করুন।
মডেল আরম্ভকরণ
ইমেজেন এডিটিং বৈশিষ্ট্যগুলি ব্যবহার করতে, এমন একটি ইমেজেন মডেল নির্দিষ্ট করুন যা ইমেজ এডিটিং সমর্থন করে, যেমন imgen-3.0-capability-001
। মডেলের সংস্করণ:
val imagenModel = Firebase.ai(backend = GenerativeBackend.vertexAI())
.imagenModel("imagen-3.0-capability-001")
মুখোশ-ভিত্তিক সম্পাদনা
ইমেজেনের মাস্ক-ভিত্তিক সম্পাদনা মডেলের জন্য নির্দিষ্ট ক্ষেত্রগুলি সংজ্ঞায়িত করে চিত্রগুলিতে পরিবর্তন করার অনুমতি দেয়। এই ক্ষমতা বিভিন্ন ধরণের ক্রিয়া সক্ষম করে, যার মধ্যে রয়েছে মুখোশ তৈরি এবং প্রয়োগ করা, বস্তু সন্নিবেশ করা বা অপসারণ করা এবং মূল সীমানা ছাড়িয়ে চিত্রের বিষয়বস্তু প্রসারিত করা।
একটি মুখোশ তৈরি করুন
মাস্ক-ভিত্তিক সম্পাদনা যেমন বস্তু সন্নিবেশ করানো বা অপসারণ করার জন্য আপনাকে মডেল, মাস্ক দ্বারা সম্পাদনা করা প্রয়োজন এমন ক্ষেত্রটি নির্ধারণ করতে হবে।
একটি মাস্ক তৈরি করতে, আপনি ImagenBackgroundMask()
অথবা ImagenSemanticMask()
ব্যবহার করে একটি ক্লাস ID পাস করে মডেলটিকে স্বয়ংক্রিয়ভাবে এটি তৈরি করতে বলতে পারেন।
আপনি একটি মাস্ক বিটম্যাপ তৈরি করে এবং এটিকে ImagenRawMask
এ রূপান্তর করে স্ক্রিনে ম্যানুয়ালি মাস্কটি আঁকতে পারেন। detectDragGestures
এবং Canvas
ব্যবহার করে, আপনি আপনার অ্যাপে Jetpack Compose এর সাথে একটি মাস্ক-ড্রয়িং ইউজার ইন্টারফেস নিম্নরূপ প্রয়োগ করতে পারেন:
import androidx.compose.ui.graphics.Color as ComposeColor
[...]
@Composable
fun ImagenEditingMaskEditor(
sourceBitmap: Bitmap,
onMaskFinalized: (Bitmap) -> Unit,
) {
val paths = remember { mutableStateListOf<Path>() }
var currentPath by remember { mutableStateOf<Path?>(null) }
var scale by remember { mutableFloatStateOf(1f) }
var offsetX by remember { mutableFloatStateOf(0f) }
var offsetY by remember { mutableFloatStateOf(0f) }
Column(
modifier = Modifier.fillMaxSize(),
) {
Box(
modifier = Modifier
.fillMaxWidth()
.pointerInput(Unit) {
detectDragGestures(
onDragStart = { startOffset ->
val transformedStart = Offset(
(startOffset.x - offsetX) / scale,
(startOffset.y - offsetY) / scale,
)
currentPath = Path().apply { moveTo(transformedStart.x, transformedStart.y) }
},
onDrag = { change, _ ->
currentPath?.let {
val transformedChange = Offset(
(change.position.x - offsetX) / scale,
(change.position.y - offsetY) / scale,
)
it.lineTo(transformedChange.x, transformedChange.y)
currentPath = Path().apply { addPath(it) }
}
change.consume()
},
onDragEnd = {
currentPath?.let { paths.add(it) }
currentPath = null
},
)
},
) {
Image(
bitmap = sourceBitmap.asImageBitmap(),
contentDescription = null,
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Fit,
)
Canvas(modifier = Modifier.fillMaxSize()) {
val canvasWidth = size.width
val canvasHeight = size.height
val bitmapWidth = sourceBitmap.width.toFloat()
val bitmapHeight = sourceBitmap.height.toFloat()
scale = min(canvasWidth / bitmapWidth, canvasHeight / bitmapHeight)
offsetX = (canvasWidth - bitmapWidth * scale) / 2
offsetY = (canvasHeight - bitmapHeight * scale) / 2
withTransform(
{
translate(left = offsetX, top = offsetY)
scale(scale, scale, pivot = Offset.Zero)
},
) {
val strokeWidth = 70f / scale
val stroke = Stroke(width = strokeWidth, cap = StrokeCap.Round, join = StrokeJoin.Round)
val pathColor = ComposeColor.White.copy(alpha = 0.5f)
paths.forEach { path ->
drawPath(path = path, color = pathColor, style = stroke)
}
currentPath?.let { path ->
drawPath(path = path, color = pathColor, style = stroke)
}
}
}
}
Button(
onClick = {
val maskBitmap = createMask(sourceBitmap, paths)
onMaskFinalized(maskBitmap)
},
) {
Text("Save mask")
}
}
}
এরপর আপনি ক্যানভাসে পাথগুলি অঙ্কন করে মাস্ক বিটম্যাপ তৈরি করতে পারেন:
import android.graphics.Color as AndroidColor
import android.graphics.Paint
[...]
private fun createMaskBitmap(
sourceBitmap: Bitmap,
paths: SnapshotStateList<Path>,
): Bitmap {
val maskBitmap = createBitmap(sourceBitmap.width, sourceBitmap.height)
val canvas = android.graphics.Canvas(maskBitmap)
val paint = Paint().apply {
color = AndroidColor.RED
strokeWidth = 70f
style = Paint.Style.STROKE
strokeCap = Paint.Cap.ROUND
strokeJoin = Paint.Join.ROUND
isAntiAlias = true
}
paths.forEach { path -> canvas.drawPath(path.asAndroidPath(), paint) }
return maskBitmap
}
নিশ্চিত করুন যে মাস্কটি উৎস ছবির আকারের সমান। আরও বিস্তারিত জানার জন্য Imagen AI ক্যাটালগ নমুনা দেখুন।
বস্তু সন্নিবেশ করান
আপনি একটি বিদ্যমান ছবিতে একটি নতুন বস্তু বা বিষয়বস্তু সন্নিবেশ করতে পারেন, যাকে inpainting ও বলা হয়। মডেলটি নতুন বিষয়বস্তু তৈরি করবে এবং নির্দিষ্ট মুখোশযুক্ত এলাকায় সন্নিবেশ করবে।
এটি অর্জন করতে, editImage()
ফাংশনটি ব্যবহার করুন। আপনাকে মূল ছবিটি, একটি মাস্ক প্রদান করতে হবে। , এবং আপনি যে কন্টেন্টটি সন্নিবেশ করতে চান তা বর্ণনা করে একটি টেক্সট প্রম্পট। এছাড়াও, একটি ImagenEditingConfig
অবজেক্ট পাস করুন, নিশ্চিত করুন যে এর editMode
প্রপার্টি ImagenEditMode.INPAINT_INSERTION
এ সেট করা আছে।
suspend fun insertFlowersIntoImage(
model: ImagenModel,
originalImage: Bitmap,
mask: ImagenMaskReference): ImagenGenerationResponse<ImagenInlineImage> {
val prompt = "a vase of flowers"
// Pass the original image, a mask, the prompt, and an editing configuration.
val editedImage = model.editImage(
sources = listOf(
ImagenRawImage(originalImage),
mask),
prompt = prompt,
// Define the editing configuration for inpainting and insertion.
config = ImagenEditingConfig(ImagenEditMode.INPAINT_INSERTION)
)
return editedImage
}
বস্তুগুলি সরান
ইনপেইন্টিং আপনাকে একটি ছবি থেকে অবাঞ্ছিত জিনিসপত্র অপসারণ করতে দেয়। এটি করার জন্য, editImage
ফাংশনটি ব্যবহার করুন। আপনাকে মূল ছবি এবং একটি মাস্ক প্রদান করতে হবে। যা আপনি যে বস্তুটি সরাতে চান তা হাইলাইট করে। ঐচ্ছিকভাবে, আপনি বস্তুটি বর্ণনা করার জন্য একটি টেক্সট প্রম্পট অন্তর্ভুক্ত করতে পারেন, যা মডেলটিকে সঠিক সনাক্তকরণে সহায়তা করতে পারে। অতিরিক্তভাবে, আপনাকে ImagenEditingConfig
এর মধ্যে editMode
ImagenEditMode.INPAINT_REMOVAL
এ সেট করতে হবে।
suspend fun removeBallFromImage(model: ImagenModel, originalImage: Bitmap, mask: ImagenMaskReference): ImagenGenerationResponse<ImagenInlineImage> {
// Optional: provide the prompt describing the content to be removed.
val prompt = "a ball"
// Pass the original image, a mask, the prompt, and an editing configuration.
val editedImage = model.editImage(
sources = listOf(
ImagenRawImage(originalImage),
mask
),
prompt = prompt,
// Define the editing configuration for inpainting and removal.
config = ImagenEditingConfig(ImagenEditMode.INPAINT_REMOVAL)
)
return editedImage
}
ছবির কন্টেন্ট প্রসারিত করুন
outpaintImage()
ফাংশন ব্যবহার করে আপনি একটি ছবিকে তার মূল সীমানা, যা outpainting নামে পরিচিত, অতিক্রম করে প্রসারিত করতে পারেন। এই ফাংশনের জন্য মূল ছবি এবং প্রসারিত ছবির প্রয়োজনীয় Dimensions
প্রয়োজন। ঐচ্ছিকভাবে, আপনি সম্প্রসারণের জন্য একটি বর্ণনামূলক প্রম্পট অন্তর্ভুক্ত করতে পারেন এবং নতুন তৈরি করা ছবির মধ্যে মূল ছবির ImagenImagePlacement
নির্দিষ্ট করতে পারেন:
suspend fun expandImage(originalImage: Bitmap, imagenModel: ImagenModel): ImagenGenerationResponse<ImagenInlineImage> {
// Optionally describe what should appear in the expanded area.
val prompt = "a sprawling sandy beach next to the ocean"
val editedImage = model.outpaintImage(
ImagenRawImage(originalImage),
Dimension(width, height),
prompt = prompt,
newPosition = ImagenImagePlacement.LEFT_CENTER
)
return editedImage
}
ব্যাকগ্রাউন্ড প্রতিস্থাপন করুন
আপনি ফোরগ্রাউন্ড সাবজেক্ট সংরক্ষণ করে একটি ছবির ব্যাকগ্রাউন্ড প্রতিস্থাপন করতে পারেন। এটি করার জন্য, editImage
ফাংশনটি ব্যবহার করুন। মূল ছবি, একটি ImagenBackgroundMask
অবজেক্ট (নতুন ব্যাকগ্রাউন্ডের জন্য একটি টেক্সট প্রম্পট ধারণকারী) এবং একটি ImagenEditingConfig
এর editMode
প্রপার্টি ImagenEditMode.INPAINT_INSERTION
এ সেট করে দিন।
suspend fun replaceBackground(model: ImagenModel, originalImage: Bitmap): ImagenGenerationResponse<ImagenInlineImage> {
// Provide the prompt describing the new background.
val prompt = "space background"
// Pass the original image, a mask, the prompt, and an editing configuration.
val editedImage = model.editImage(
sources = listOf(
ImagenRawImage(originalImage),
ImagenBackgroundMask(),
),
prompt = prompt,
config = ImagenEditingConfig(ImagenEditMode.INPAINT_INSERTION)
)
return editedImage
}
কাস্টমাইজেশন
আপনি ইমেজেনের কাস্টমাইজেশন ক্ষমতা ব্যবহার করে বিষয়, নিয়ন্ত্রণ বা শৈলী নির্দিষ্ট করে এমন রেফারেন্স চিত্রের উপর ভিত্তি করে ছবি তৈরি বা সম্পাদনা করতে পারেন। মডেলটিকে গাইড করার জন্য এক বা একাধিক রেফারেন্স চিত্র সহ একটি টেক্সট প্রম্পট প্রদান করে এটি সম্পন্ন করা হয়।
বিষয়ের উপর ভিত্তি করে কাস্টমাইজ করুন
আপনি একটি রেফারেন্স ছবি (যেমন, একটি পণ্য, ব্যক্তি, বা প্রাণী) থেকে একটি নির্দিষ্ট বিষয়ের নতুন ছবি তৈরি করতে পারেন। কেবল একটি টেক্সট প্রম্পট এবং বিষয়ের কমপক্ষে একটি রেফারেন্স ছবি প্রদান করুন। উদাহরণস্বরূপ, আপনি আপনার পোষা প্রাণীর একটি ছবি আপলোড করতে পারেন এবং সম্পূর্ণ ভিন্ন পরিবেশে এটির একটি নতুন ছবি তৈরি করতে পারেন।
এটি করার জন্য, ImagenSubjectReference
ব্যবহার করে বিষয় রেফারেন্সটি সংজ্ঞায়িত করুন এবং তারপর আপনার প্রম্পটের সাথে এটি editImage
এ পাস করুন। এছাড়াও, একটি ImagenEditingConfig
অন্তর্ভুক্ত করুন যা editSteps
এর সংখ্যা নির্দিষ্ট করে; একটি উচ্চতর editSteps
মান সাধারণত উন্নত মানের ফলাফলের দিকে পরিচালিত করে:
suspend fun customizeCatImage(model: ImagenModel, referenceCatImage: Bitmap): ImagenGenerationResponse<ImagenInlineImage> {
// Define the subject reference using the reference image.
val subjectReference = ImagenSubjectReference(
image = referenceCatImage,
referenceID = 1,
description = "cat",
subjectType = ImagenSubjectReferenceType.ANIMAL
)
// Provide a prompt that describes the final image.
// The "[1]" links the prompt to the subject reference with ID 1.
val prompt = "A cat[1] flying through outer space"
// Use the editImage API to perform the subject customization.
val editedImage = model.editImage(
references = listOf(subjectReference),
prompt = prompt,
config = ImagenEditingConfig(
editSteps = 50 // Number of editing steps, a higher value can improve quality
)
)
return editedImage
}
নিয়ন্ত্রণের উপর ভিত্তি করে কাস্টমাইজ করুন
এই কৌশলটি একটি নিয়ন্ত্রণ রেফারেন্স চিত্রের উপর ভিত্তি করে একটি নতুন চিত্র তৈরি করে, যেমন একটি হাতে আঁকা স্কেচ ("স্ক্রিবল"), একটি ক্যানি এজ চিত্র , অথবা একটি মুখের জাল। মডেলটি নতুন চিত্রের বিন্যাস এবং রচনার জন্য কাঠামোগত নির্দেশিকা হিসাবে নিয়ন্ত্রণ চিত্র ব্যবহার করে, যখন পাঠ্য প্রম্পট রঙ এবং টেক্সচারের মতো বিশদ সরবরাহ করে।
ImagenControlReference
ব্যবহার করে একটি কন্ট্রোল রেফারেন্স সংজ্ঞায়িত করুন এবং এটি editImage
একটি প্রম্পট সহ প্রদান করুন এবং ImagenEditingConfig
editSteps
এর সংখ্যা (একটি উচ্চতর মান মান উন্নত করতে পারে) সহ প্রদান করুন:
suspend fun customizeCatImageByControl(model: ImagenModel, referenceCatImage: Bitmap): ImagenGenerationResponse<ImagenInlineImage> {
// Define the subject reference using the reference image.
val controlReference = ImagenControlReference(
image = referenceImage,
referenceID = 1,
controlType = CONTROL_TYPE_SCRIBBLE
)
val prompt = "A cat flying through outer space arranged like the scribble map[1]"
val editedImage = model.editImage(
references = listOf(controlReference),
prompt = prompt,
config = ImagenEditingConfig(
editSteps = 50
)
)
return editedImage
}
স্টাইলের উপর ভিত্তি করে কাস্টমাইজ করুন
আপনি একটি রেফারেন্স চিত্র থেকে একটি নির্দিষ্ট শৈলীর সাথে মিল রেখে একটি চিত্র তৈরি বা সম্পাদনা করতে পারেন, যেমন এর প্যাটার্ন, টেক্সচার, বা নকশা। মডেলটি প্রয়োজনীয় নান্দনিকতা বোঝার জন্য রেফারেন্স চিত্রটি ব্যবহার করে এবং টেক্সট প্রম্পটে বর্ণিত নতুন চিত্রটিতে এটি প্রয়োগ করে। উদাহরণস্বরূপ, আপনি সেই চিত্রকর্মের একটি চিত্র প্রদান করে একটি বিখ্যাত চিত্রকর্মের স্টাইলে একটি বিড়ালের চিত্র তৈরি করতে পারেন।
ImagenStyleReference
ব্যবহার করে একটি স্টাইল রেফারেন্স নির্ধারণ করুন এবং এটি editImage
একটি প্রম্পট সহ প্রদান করুন এবং ImagenEditingConfig
editSteps
এর সংখ্যা (একটি উচ্চতর মান মান উন্নত করতে পারে) সহ প্রদান করুন:
suspend fun customizeImageByStyle(model: ImagenModel, referenceVanGoghImage: Bitmap): ImagenGenerationResponse<ImagenInlineImage> {
// Define the style reference using the reference image.
val styleReference = ImagenStyleReference(
image = referenceVanGoghImage,
referenceID = 1,
description = "Van Gogh style"
)
// Provide a prompt that describes the final image.
// The "1" links the prompt to the style reference with ID 1.
val prompt = "A cat flying through outer space, in the Van Gogh style[1]"
// Use the editImage API to perform the style customization.
val editedImage = model.editImage(
references = listOf(styleReference),
prompt = prompt,
config = ImagenEditingConfig(
editSteps = 50 // Number of editing steps, a higher value can improve quality
)
)
return editedImage
}
পরবর্তী পদক্ষেপ
- Firebase ডকুমেন্টেশনে Firebase AI Logic সম্পর্কে আরও জানুন।
- অ্যান্ড্রয়েড এআই নমুনা ক্যাটালগটি অন্বেষণ করুন।