Как показать изображение в черно-белом режиме в Android Compose
Dec 02 2020
Я пытаюсь преобразовать показанное цветное изображение в черно-белое с помощью Android Compose.
В системе просмотра я мог изменить изображение с цветного на черно-белое, добавив такой фильтр
imageView.colorFilter = ColorMatrixColorFilter(ColorMatrix().apply { setSaturation(0f)})
как показано в этом ответе .
В Android Compose функция составления изображений уже использует цветной фильтр, но я не могу найти эквивалент 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
)
Ответы
nglauber Jan 09 2021 at 20:59
Я попробовал этот ответ и работал у меня: преобразовать растровое изображение в GrayScale в Android
Итак, вам просто нужно использовать 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
}