Android - ColorMatrix 处理图像对比度

Posted 匆忙拥挤repeat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android - ColorMatrix 处理图像对比度相关的知识,希望对你有一定的参考价值。

ColorMatrix 没有直接处理对比度的方法。
内部有一个 4x5的矩阵数组:

 * <pre>
 *   R&rsquo; = a*R + b*G + c*B + d*A + e;
 *   G&rsquo; = f*R + g*G + h*B + i*A + j;
 *   B&rsquo; = k*R + l*G + m*B + n*A + o;
 *   A&rsquo; = p*R + q*G + r*B + s*A + t;</pre>

仿GPUImage实现

找到 Android-GPUImage 实现

public static final String CONTRAST_FRAGMENT_SHADER = "" +
            "varying highp vec2 textureCoordinate;\\n" +
            " \\n" +
            " uniform sampler2D inputImageTexture;\\n" +
            " uniform lowp float contrast;\\n" +
            " \\n" +
            " void main()\\n" +
            " \\n" +
            "     lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);\\n" +
            "     \\n" +
            "     gl_FragColor = vec4(((textureColor.rgb - vec3(0.5)) * contrast + vec3(0.5)), textureColor.w);\\n" +
            " ";

仿照 gl_FragColor 来处理:

//对比度范围 [0,2f]
val matrix = ColorMatrix() //4x5矩阵,rgba+偏移
matrix.setScale(lum, lum, lum, 1f)
val ary = matrix.array
ary[0] = (ary[0] - 0.5f) * contrast + 0.5f
ary[1] = (ary[1] - 0.5f) * contrast + 0.5f
ary[2] = (ary[2] - 0.5f) * contrast + 0.5f

ary[5] = (ary[5] - 0.5f) * contrast + 0.5f
ary[6] = (ary[6] - 0.5f) * contrast + 0.5f
ary[7] = (ary[7] - 0.5f) * contrast + 0.5f

ary[10] = (ary[10] - 0.5f) * contrast + 0.5f
ary[11] = (ary[11] - 0.5f) * contrast + 0.5f
ary[12] = (ary[12] - 0.5f) * contrast + 0.5f
paint.colorFilter = ColorMatrixColorFilter(matrix)

另一个对比度算法

后来产品说,上面的GPUImage实现和PS中的对比度感觉不一样。
后来找到文章: 色彩矩阵滤镜

文中给出的 矩阵应用:

N,0,0,0,128*(1-N)
0,N,0,0,128*(1-N)
0,0,N,0,128*(1-N)
0,0,0,1,0

N=0 时, 得到的是一幅灰度的图像(R、G、B每行第5个元素值为:128);
而 N=1时, 是原始效果, N越大,越大颜色越强烈。

实现代码:

fun contrast(bm: Bitmap, contrast: Int) 
	val result = bm.copy(bm.config, true)
	val canvas = Canvas(result)
	val m = ColorMatrix()
	//设置正对角线 值
	m.setScale(contrast, contrast, contrast, 1f)
	//设置 offset
	val ary = m.array
	ary[4] = 128 * (1 - contrast)
	ary[9] = 128 * (1 - contrast)
	ary[14] = 128 * (1 - contrast)
	val p = Paint()
	p.colorFilter = ColorMatrixColorFilter(m)
	canvas.drawFilter = PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG) //canvas加抗锯齿
    canvas.drawBitmap(bm, 0f, 0f, p)
    return result

实际应用时,可以有其它方式,来动态改变灰度系数 ,即 128 所表示的;动态改变对比值 contrast。


以上是关于Android - ColorMatrix 处理图像对比度的主要内容,如果未能解决你的问题,请参考以下文章

浅谈android中图片处理之色彩特效处理ColorMatrix

Android的矩阵:ColorMatrix

Android图像处理之图形特效处理

Android 颜色矩阵——ColorMatrix

怎样才能得到ffmpeg的colorchannelmixer的colormatrix

Android Matrix矩阵详解