मैं एंड्रॉइड कंपोज़ का उपयोग करके दिखाई गई रंगीन छवि को ब्लैक एंड व्हाइट में बदलने की कोशिश कर रहा हूं।

दृश्य प्रणाली में, मैं उस तरह का फ़िल्टर जोड़कर छवि को रंगीन से काले और सफेद में बदल सकता था

imageView.colorFilter = ColorMatrixColorFilter(ColorMatrix().apply { setSaturation(0f)})

जैसा कि इस उत्तर में दिखाया गया है।

Android कंपोज़ में इमेज कंपोज़ेबल फ़ंक्शन पहले से ही कलर फ़िल्टर लेता है लेकिन मुझे कंपोज़ पैकेज में ColorMatrixColorFilter समकक्ष नहीं मिल रहा है।

यहाँ छवि कोड है जिसे मैं ग्रेस्केल में बदलना चाहता हूँ

 Image(
            asset = vectorResource(id = R.drawable.xxx),
            modifier = Modifier.clip(RectangleShape).size(36.dp, 26.dp),
            alpha = alpha,
            alignment = Alignment.Center,
            contentScale = ContentScale.Fit
        )
6
David Ibrahim 2 पद 2020, 10:15

2 जवाब

सबसे बढ़िया उत्तर

मैंने इस उत्तर की कोशिश की और मेरे लिए काम किया: एंड्रॉइड में बिटमैप को ग्रेस्केल में बदलें

तो, आपको बस toGrayscale फ़ंक्शन का उपयोग करने की आवश्यकता है...

यह जो मैंने किया है:

@Composable
fun GrayscaleImage() {
    val context = AmbientContext.current
    val image = remember {
        val drawable = ContextCompat.getDrawable(
            context, R.drawable.your_drawable
        ).toBitmap()!!.toGrayScale().asImageBitmap()
    }
    Image(image)
}


object Constants{
    val grayPaint = android.graphics.Paint()
    init {
        val cm = ColorMatrix()
        cm.setSaturation(0f)
        val f = ColorMatrixColorFilter(cm)
        grayPaint.colorFilter = f
    }
}


fun Bitmap.toGrayscale(): Bitmap {
    val height: Int = this.height
    val width: Int = this.width
    val bmpGrayscale: Bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
    val c = Canvas(bmpGrayscale)
    c.drawBitmap(this, 0f, 0f, Constants.grayPaint)
    return bmpGrayscale
}
0
David Ibrahim 11 जिंदा 2021, 17:32
मैं बिटमैप्स नहीं ड्रॉएबल्स के साथ काम कर रहा हूं इसलिए मैं BitmapFactory.decodeResource( context.resources,R.drawable.ic_launcher) का उपयोग नहीं कर सकता
 – 
David Ibrahim
10 जिंदा 2021, 19:27
1
आप किसी भी ड्रॉएबल को बिटमैप में बदल सकते हैं... androidx कोर लाइब्रेरी (androidx.core:core-ktx) में अब ऐसा करने के लिए एक एक्सटेंशन फ़ंक्शन है ... मैंने शेपड्राएबल के साथ एक शॉट दिया और यह काम कर गया ...
 – 
nglauber
11 जिंदा 2021, 02:38

मुझे आशा है कि मैंने समस्या को गलत नहीं समझा है, लेकिन इससे मुझे छवि को ग्रेस्केल में बदलने में मदद मिली। यह वर्तमान कंपोज़ संस्करण 1.0.0-बीटा01 . के अनुसार है

val grayScaleMatrix = ColorMatrix(
        floatArrayOf(
            0.33f, 0.33f, 0.33f, 0f, 0f,
            0.33f, 0.33f, 0.33f, 0f, 0f,
            0.33f, 0.33f, 0.33f, 0f, 0f,
            0f, 0f, 0f, 1f, 0f
        )
    )
Image(
        painter = painterResource(id = imageId),
        contentDescription = "",
        colorFilter = ColorFilter.colorMatrix(matrix)
    )
3
Shubhayu 9 अप्रैल 2021, 03:28
क्या आप अपने कोड को और अधिक समझा सकते हैं, विशेष रूप से वह ग्रेस्केलमैट्रिक्स मान
 – 
David Ibrahim
10 अप्रैल 2021, 11:46