美文网首页Android开发经验谈@IT·互联网
android对比度/亮度/饱和度的设置

android对比度/亮度/饱和度的设置

作者: InFatuated | 来源:发表于2024-03-18 11:51 被阅读0次

    针对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
        }
    

    相关文章

      网友评论

        本文标题:android对比度/亮度/饱和度的设置

        本文链接:https://www.haomeiwen.com/subject/ihoazdtx.html