Como mostrar a imagem em preto e branco na composição do Android

Dec 02 2020

Estou tentando converter a imagem colorida mostrada em preto e branco usando a composição do Android.

No sistema de visualização, eu poderia mudar a imagem de colorida para preto e branco adicionando um filtro como esse

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

como mostrado nesta resposta .

No Android Compose, a função de composição de imagem já usa o filtro de cores, mas não consigo encontrar o equivalente em ColorMatrixColorFilter no pacote de composição.

Aqui está o código da imagem que desejo converter para escala de cinza

 Image(
            asset = vectorResource(id = R.drawable.xxx),
            modifier = Modifier.clip(RectangleShape).size(36.dp, 26.dp),
            alpha = alpha,
            alignment = Alignment.Center,
            contentScale = ContentScale.Fit
        )

Respostas

nglauber Jan 09 2021 at 20:59

Tentei esta resposta e funcionou para mim: Converter um bitmap em GrayScale no Android

Então, você só precisa usar a toGrayscalefunção ...

Isso é o que eu fiz:

@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
}