android对比度/亮度/饱和度的设置
2024-03-18 本文已影响0人
InFatuated
针对Bitmap:
/**
* 应用颜色效果到指定的位图上,包括亮度、对比度和饱和度的调整。
*
* @param brightness 亮度值,范围为0到100,其中50表示没有变化。
* @param contrast 对比度值,范围为0到100,其中50表示没有变化。
* @param saturation 饱和度值,范围为0到100,其中50表示灰度,100表示完全饱和。
*/
private fun applyColorEffect(
brightness: Int,
contrast: Int,
saturation: Int,
bitmap: Bitmap
) {
// 计算并设置亮度
val lum = (brightness - 50) * 2 * 0.3f * 255 * 0.01f
val brightnessArray = floatArrayOf(
1f, 0f, 0f, 0f, lum,
0f, 1f, 0f, 0f, lum,
0f, 0f, 1f, 0f, lum,
0f, 0f, 0f, 1f, 0f
)
colorMatrix.set(brightnessArray)
// 计算并设置对比度
val scale = (contrast - 50 + 100) / 100f
val offset = 0.5f * (1 - scale) + 0.5f
val contrastArray =
floatArrayOf(
scale, 0f, 0f, 0f, offset,
0f, scale, 0f, 0f, offset,
0f, 0f, scale, 0f, offset,
0f, 0f, 0f, 1f, 0f
)
colorMatrix.postConcat(ColorMatrix(contrastArray))
// 设置饱和度
val saturationMatrix = ColorMatrix()
saturationMatrix.setSaturation(((saturation - 50) / 50) * 0.3f + 1)
colorMatrix.postConcat(saturationMatrix)
// 创建颜色过滤器,用于之后的绘制操作
val colorFilter = ColorMatrixColorFilter(colorMatrix)
// 创建画笔,并设置颜色过滤器
val paint = Paint().apply {
this.colorFilter = colorFilter
}
// 创建画布,并在新的位图上绘制原位图,应用之前设置的颜色效果
val canvas = Canvas(resultBitmap!!)
canvas.drawBitmap(bitmap, 0f, 0f, paint)
// 将应用了效果的位图显示到ImageView上
iv.setImageBitmap(resultBitmap)
}
直接通过ImageView的colorFilter:
/**
* 应用颜色效果到指定的位图上,包括亮度、对比度和饱和度的调整。
*
* @param brightness 亮度值,范围为0到100,其中50表示没有变化。
* @param contrast 对比度值,范围为0到100,其中50表示没有变化。
* @param saturation 饱和度值,范围为0到100,其中50表示灰度,100表示完全饱和。
*/
private fun applyColorEffect(
brightness: Int,
contrast: Int,
saturation: Int,
) {
val colorMatrix = ColorMatrix()
// 计算并设置亮度
val lum = (brightness - 50) * 2 * 0.3f * 255 * 0.01f
val brightnessArray = floatArrayOf(
1f, 0f, 0f, 0f, lum,
0f, 1f, 0f, 0f, lum,
0f, 0f, 1f, 0f, lum,
0f, 0f, 0f, 1f, 0f
)
colorMatrix.set(brightnessArray)
// 计算并设置对比度
val scale = (contrast - 50 + 100) / 100f
val offset = 0.5f * (1 - scale) + 0.5f
val contrastArray =
floatArrayOf(
scale, 0f, 0f, 0f, offset,
0f, scale, 0f, 0f, offset,
0f, 0f, scale, 0f, offset,
0f, 0f, 0f, 1f, 0f
)
colorMatrix.postConcat(ColorMatrix(contrastArray))
// 设置饱和度
val saturationMatrix = ColorMatrix()
saturationMatrix.setSaturation(((saturation - 50) / 50) * 0.3f + 1)
colorMatrix.postConcat(saturationMatrix)
// 创建并设置ColorMatrixColorFilter
val colorFilter = ColorMatrixColorFilter(colorMatrix)
iv.colorFilter = colorFilter
}