इमेज को पसंद के मुताबिक बनाना

Image कॉम्पोज़ेबल (contentScale, colorFilter) पर मौजूद प्रॉपर्टी का इस्तेमाल करके, इमेज को पसंद के मुताबिक बनाया जा सकता है. अपने Image पर अलग-अलग इफ़ेक्ट लागू करने के लिए, मौजूदा Modifiers को भी लागू किया जा सकता है. मॉडिफ़ायर का इस्तेमाल किसी भी कंपोज़ेबल, सिर्फ़ Image कंपोज़ेबल नहीं, बल्कि contentScale और colorFilter, कंपोज़ेबल Image में साफ़ तौर पर मौजूद पैरामीटर हैं.

कॉन्टेंट का स्केल

इमेज को काटने या उसके स्केल को बदलने के लिए, contentScale विकल्प चुनें. अगर आपने contentScale विकल्प नहीं चुना है, तो डिफ़ॉल्ट रूप से ContentScale.Fit का इस्तेमाल किया जाएगा.

नीचे दिए गए उदाहरण में, इमेज कंपोज़ेबल को 150dp के साइज़ में Image कंपोज़ेबल पर बॉर्डर और बैकग्राउंड को पीले रंग पर सेट किया गया है, ताकि उन्हें दिखाया जा सके नीचे दी गई टेबल में, ContentScale के अलग-अलग विकल्प मौजूद हैं.

val imageModifier = Modifier
    .size(150.dp)
    .border(BorderStroke(1.dp, Color.Black))
    .background(Color.Yellow)
Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description),
    contentScale = ContentScale.Fit,
    modifier = imageModifier
)

ContentScale के अलग-अलग विकल्प सेट करने पर, अलग-अलग आउटपुट मिलेंगे. तय सीमा से कम इस टेबल से आपको सही ContentScale मोड चुनने में मदद मिलेगी ज़रूरी है:

सोर्स इमेज पोर्ट्रेट सोर्स इमेज सोर्स इमेज का लैंडस्केप
ContentScale नतीजा - पोर्ट्रेट इमेज: नतीजा - लैंडस्केप इमेज:
ContentScale.Fit: आसपेक्ट रेशियो (डिफ़ॉल्ट) रखते हुए, इमेज का साइज़ एक जैसा रखें. अगर कॉन्टेंट का साइज़ साइज़ से छोटा है, तो इमेज को सीमाओं में फ़िट करने के लिए स्केल किया जाता है. ContentScale.Fit पोर्ट्रेट ContentScale.Fit लैंडस्केप
ContentScale.Crop: उपलब्ध जगह में इमेज को बीच में रखकर काटें. ContentScale.Crop portrait ContentScale.Crop लैंडस्केप
ContentScale.FillHeight: आसपेक्ट रेशियो को बनाए रखते हुए सोर्स को स्केल करें, ताकि बॉउंड, डेस्टिनेशन की ऊंचाई से मेल खा सकें. ContentScale.FillHight पोर्ट्रेट ContentScale.FillHight लैंडस्केप
ContentScale.FillWidth: आस्पेक्ट रेशियो को बनाए रखते हुए सोर्स को स्केल करें, ताकि बाउंड, डेस्टिनेशन की चौड़ाई से मेल खाएं. ContentScale.Fillwidth पोर्ट्रेट ContentScale.Fillwidth लैंडस्केप
ContentScale.FillBounds: डेस्टिनेशन की सीमाओं को भरने के लिए, कॉन्टेंट को एक ही तरह से वर्टिकल और हॉरिज़ॉन्टल तौर पर स्केल करें. (ध्यान दें: अगर इमेज को ऐसे कंटेनर में डाला जाता है जो इमेज के आसपेक्ट रेशियो से मेल नहीं खाते, तो इमेज खराब हो जाएंगी) ContentScale.FillBounds पोर्ट्रेट ContentScale.FillBounds लैंडस्केप
ContentScale.Inside: डेस्टिनेशन के बाउंड में आसपेक्ट रेशियो बनाए रखने के लिए, सोर्स को स्केल करें. अगर सोर्स, दोनों डाइमेंशन में डेस्टिनेशन से छोटा या उसके बराबर है, तो यह `कोई नहीं` की तरह काम करता है. सामग्री हमेशा इन सीमाओं के अंदर शामिल की जाएगी. अगर कॉन्टेंट, बॉउंड से छोटा है, तो स्केलिंग लागू नहीं होगी. सोर्स इमेज सीमा से बड़ी है: ContentScale.Inside पोर्ट्रेट, सोर्स इमेज का साइज़ तय सीमाओं से बड़ा है अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सोर्स इमेज, तय सीमाओं से छोटी है: ContentScale.Inside पोर्ट्रेट, सोर्स इमेज, तय सीमाओं से छोटी है सोर्स इमेज, बॉर्डर से बड़ी है: ContentScale.Inside landscape, source image larger than bounds सोर्स इमेज, बॉर्डर से छोटी है: ContentScale.लैंडस्केप मोड में, सोर्स इमेज बॉर्डर से छोटी है
ContentScale.None: सोर्स पर कोई स्केलिंग लागू न करें. अगर कॉन्टेंट का साइज़, डेस्टिनेशन की सीमाओं से कम है, तो उसे एरिया के हिसाब से नहीं बढ़ाया जा सकेगा. सोर्स इमेज, बॉर्डर से बड़ी है: ContentScale.कोई पोर्ट्रेट नहीं, सोर्स इमेज सीमा से बड़ी है सोर्स इमेज, बॉर्डर से छोटी है: ContentScale.None पोर्ट्रेट, सोर्स इमेज बॉउंड से छोटी है सोर्स इमेज, बॉर्डर से बड़ी है: ContentScale.कोई लैंडस्केप नहीं, सोर्स इमेज सीमा से बड़ी है सोर्स इमेज, बॉर्डर से छोटी है: ContentScale.None लैंडस्केप, सोर्स इमेज बॉउंड से छोटी है

किसी आकार में Image कॉम्पोज़ेबल को क्लिप करना

किसी इमेज को सही आकार देने के लिए, उसमें पहले से मौजूद clip मॉडिफ़ायर का इस्तेमाल करें. किसी इमेज को सर्कल के आकार में काटने के लिए, Modifier.clip(CircleShape) का इस्तेमाल करें:

Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description),
    contentScale = ContentScale.Crop,
    modifier = Modifier
        .size(200.dp)
        .clip(CircleShape)
)

CircleShape का इस्तेमाल करके इमेज को क्लिप करना
पहली इमेज: 'सर्कल के आकार' वाली इमेज से क्लिप बनाना

गोल कोने का आकार - Modifier.clip(RoundedCornerShape(16.dp)) का इस्तेमाल करें कोनों का आकार जिन्हें आप गोल करना चाहते हैं:

Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description),
    contentScale = ContentScale.Crop,
    modifier = Modifier
        .size(200.dp)
        .clip(RoundedCornerShape(16.dp))
)

RoundedCornerShape का इस्तेमाल करके इमेज को क्लिप करना
दूसरी इमेज: राउंडेड कॉर्नर शेप वाली इमेज से क्लिप बनाना

Shape को बड़ा करके, अपनी पसंद का क्लिपिंग आकार भी बनाया जा सकता है. साथ ही, क्लिप करने के लिए आकार के तौर पर Path भी दिया जा सकता है:

class SquashedOval : Shape {
    override fun createOutline(
        size: Size,
        layoutDirection: LayoutDirection,
        density: Density
    ): Outline {
        val path = Path().apply {
            // We create an Oval that starts at ¼ of the width, and ends at ¾ of the width of the container.
            addOval(
                Rect(
                    left = size.width / 4f,
                    top = 0f,
                    right = size.width * 3 / 4f,
                    bottom = size.height
                )
            )
        }
        return Outline.Generic(path = path)
    }
}

Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description),
    contentScale = ContentScale.Crop,
    modifier = Modifier
        .size(200.dp)
        .clip(SquashedOval())
)

पसंद के मुताबिक पाथ आकार वाली इमेज से क्लिप बनाना
तीसरी इमेज: पसंद के मुताबिक पाथ आकार वाली इमेज से क्लिप बनाना

Image कंपोज़ेबल में बॉर्डर जोड़ें

Modifier.border() को Modifier.clip() के साथ जोड़ना एक सामान्य कार्रवाई है चित्र के चारों ओर बॉर्डर बनाने के लिए:

val borderWidth = 4.dp
Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description),
    contentScale = ContentScale.Crop,
    modifier = Modifier
        .size(150.dp)
        .border(
            BorderStroke(borderWidth, Color.Yellow),
            CircleShape
        )
        .padding(borderWidth)
        .clip(CircleShape)
)

इमेज को क्लिप करें और उसके चारों तरफ़ बॉर्डर बनाएं
चौथी इमेज: किसी इमेज को क्लिप करना और उसके चारों ओर बॉर्डर जोड़ना

अगर आपको ग्रेडिएंट बॉर्डर बनाना है, तो इमेज के चारों ओर रेनबो ग्रेडिएंट बॉर्डर बनाने के लिए, Brush एपीआई का इस्तेमाल किया जा सकता है:

val rainbowColorsBrush = remember {
    Brush.sweepGradient(
        listOf(
            Color(0xFF9575CD),
            Color(0xFFBA68C8),
            Color(0xFFE57373),
            Color(0xFFFFB74D),
            Color(0xFFFFF176),
            Color(0xFFAED581),
            Color(0xFF4DD0E1),
            Color(0xFF9575CD)
        )
    )
}
val borderWidth = 4.dp
Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description),
    contentScale = ContentScale.Crop,
    modifier = Modifier
        .size(150.dp)
        .border(
            BorderStroke(borderWidth, rainbowColorsBrush),
            CircleShape
        )
        .padding(borderWidth)
        .clip(CircleShape)
)

रेनबो ग्रेडिएंट वाला सर्कल बॉर्डर
इमेज 5: रेनबो ग्रेडिएंट सर्कल बॉर्डर

आसपेक्ट रेशियो या चौड़ाई-ऊंचाई का अनुपात अपने हिसाब से सेट करना

किसी इमेज को कस्टम आसपेक्ट रेशियो में बदलने के लिए, Modifier.aspectRatio(16f/9f) का इस्तेमाल करें. इससे, किसी इमेज (या उससे मिलती-जुलती किसी भी चीज़) के लिए कस्टम रेशियो दिया जा सकता है.

Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description),
    modifier = Modifier.aspectRatio(16f / 9f)
)

इमेज पर Modifier.aspectRatio(16f/9f) का इस्तेमाल करना
छठी इमेज: इमेज पर Modifier.aspectRatio(16f/9f) का इस्तेमाल करना

रंग फ़िल्टर - चित्र के पिक्सेल रंगों को रूपांतरित करें

इमेज कंपोज़ेबल में एक colorFilter पैरामीटर है, जो अपनी इमेज के अलग-अलग पिक्सल.

इमेज का रंग बदलना

ColorFilter.tint(color, blendMode) का इस्तेमाल करने पर, ब्लेंड मोड इन चीज़ों के साथ लागू हो जाएगा: आपके Image कंपोज़ेबल को रंग दिया गया है. ColorFilter.tint(color, blendMode) अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है कॉन्टेंट को टिंट करने के लिए BlendMode.SrcIn का इस्तेमाल करता है. इसका मतलब है कि दिया गया रंग जहां स्क्रीन पर इमेज दिखती है. यह आइकॉन और इन दोनों के लिए काम आता है जिन्हें अलग-अलग थीम पर बनाया जाना चाहिए.

Image(
    painter = painterResource(id = R.drawable.baseline_directions_bus_24),
    contentDescription = stringResource(id = R.string.bus_content_description),
    colorFilter = ColorFilter.tint(Color.Yellow)
)

BlendMode.SrcIn के साथ लागू किया गया ColorFilter.tint
सातवां इलस्ट्रेशन: BlendMode.SrcIn के साथ लागू किया गया ColorFilter.tint

अन्य BlendMode के नतीजे अलग-अलग होते हैं. उदाहरण के लिए, किसी इमेज पर Color.Green के साथ BlendMode.Darken सेट करने पर, यह नतीजा मिलता है:

Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description),
    colorFilter = ColorFilter.tint(Color.Green, blendMode = BlendMode.Darken)
)

LayoutMode.Darken के साथ कलर.ग्रीन टिंट
इमेज 8: ब्लाइंड मोड के साथ कलर.ग्रीन टिंट.गहरा

उपलब्ध अलग-अलग ब्लेंड मोड के बारे में ज़्यादा जानकारी के लिए, BlendMode का रेफ़रंस दस्तावेज़ देखें.

कलर मैट्रिक्स वाला Image फ़िल्टर लागू करना

कलर मैट्रिक्स ColorFilter विकल्प का इस्तेमाल करके, अपनी इमेज को पूरी तरह बदलें. उदाहरण के लिए, अपनी इमेज पर ब्लैक एंड व्हाइट फ़िल्टर लगाने के लिए, ColorMatrix और सेचुरेशन को 0f पर सेट करें.

Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description),
    colorFilter = ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0f) })
)

सैचुरेशन 0 वाला कलर मैट्रिक्स (काली और सफ़ेद रंग की इमेज)
नौवीं इमेज: संतृप्ति 0 (ब्लैक ऐंड व्हाइट इमेज) वाला कलर मैट्रिक्स

Image कॉम्पोज़ेबल के कंट्रास्ट या चमक को अडजस्ट करना

किसी इमेज का कंट्रास्ट और उसकी चमक बदलने के लिए, वैल्यू बदलने के लिए ColorMatrix का इस्तेमाल किया जा सकता है:

val contrast = 2f // 0f..10f (1 should be default)
val brightness = -180f // -255f..255f (0 should be default)
val colorMatrix = floatArrayOf(
    contrast, 0f, 0f, 0f, brightness,
    0f, contrast, 0f, 0f, brightness,
    0f, 0f, contrast, 0f, brightness,
    0f, 0f, 0f, 1f, 0f
)
Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description),
    colorFilter = ColorFilter.colorMatrix(ColorMatrix(colorMatrix))
)

ColorMatrix का इस्तेमाल करके, इमेज की चमक और कंट्रास्ट में बदलाव करना
पहली इमेज: ColorMatrix का इस्तेमाल करके, इमेज की चमक और कंट्रास्ट में बदलाव किया गया

Image कंपोज़ेबल के रंगों को बदलें

किसी इमेज के रंगों को उलटने के लिए, रंगों को उलटने के लिए ColorMatrix को सेट करें:

val colorMatrix = floatArrayOf(
    -1f, 0f, 0f, 0f, 255f,
    0f, -1f, 0f, 0f, 255f,
    0f, 0f, -1f, 0f, 255f,
    0f, 0f, 0f, 1f, 0f
)
Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description),
    colorFilter = ColorFilter.colorMatrix(ColorMatrix(colorMatrix))
)

इमेज के रंग उलटने की सुविधा
इमेज 11: इमेज पर उलटे रंग

Image कंपोज़ेबल को धुंधला करें

किसी इमेज को धुंधला करने के लिए, Modifier.blur() का इस्तेमाल करें. इसके लिए, radiusX और radiusY दें, यह सुविधा, हॉरिज़ॉन्टल और वर्टिकल डायरेक्शन में ब्लर रेडियस बताती है क्रम से.

Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description),
    contentScale = ContentScale.Crop,
    modifier = Modifier
        .size(150.dp)
        .blur(
            radiusX = 10.dp,
            radiusY = 10.dp,
            edgeTreatment = BlurredEdgeTreatment(RoundedCornerShape(8.dp))
        )
)

इमेज पर धुंधला करने वाला इफ़ेक्ट लागू किया गया
इमेज पर लागू किया गया BlurEffect

Images को धुंधला करते समय, हमारा सुझाव है कि आप BlurredEdgeTreatment.Unbounded के बजाय BlurredEdgeTreatment(Shape) का इस्तेमाल करें. ऐसा इसलिए, क्योंकि BlurredEdgeTreatment.Unbounded का इस्तेमाल, ऐसे रेंडरिंग को धुंधला करने के लिए किया जाता है जो मूल कॉन्टेंट के दायरे से बाहर रेंडर हो सकते हैं. ऐसा हो सकता है कि इमेज, कॉन्टेंट के दायरे से बाहर न दिखें. हालांकि, राउंडेड रेक्टैंगल को धुंधला करने के लिए, इस तरह के अंतर की ज़रूरत पड़ सकती है.

उदाहरण के लिए, अगर हम BlurredEdgeTreatment को ऊपर दी गई वैल्यू पर 'अनबाउंड नहीं' पर सेट करते हैं इमेज के लिए, इमेज के किनारे साफ़ के बजाय धुंधले दिखते हैं:

Image(
    painter = painterResource(id = R.drawable.dog),
    contentDescription = stringResource(id = R.string.dog_content_description),
    contentScale = ContentScale.Crop,
    modifier = Modifier
        .size(150.dp)
        .blur(
            radiusX = 10.dp,
            radiusY = 10.dp,
            edgeTreatment = BlurredEdgeTreatment.Unbounded
        )
        .clip(RoundedCornerShape(8.dp))
)

ब्लरएडजट्रीटमेंट.अनबाउंड
पहली इमेज: BlurEdgeTreatment.Unbounded