本篇学习Paint的颜色过滤器ColorFilter。
ColorFilter下有3个子类ColorMatrixColorFilter, LightingColorFilter, PorterDuffColorFilter ,下面逐一学习一下。
1.LightingColorFilter
LightingColorFilter的构造方法有三个参数,LightingColorFilter(int mul,int add)
参数说明:
mul和add都是和颜色值格式相同的int值(十六进制),其中mul用来和目标像素相乘,add用来和目标像素相加,计算公式如下
R’ = R * mul.R / 0xff + add.R
G’ = G * mul.G / 0xff +add.G
B’ = B * mul.B / 0xff + add.B

2.PorterDuffColorFilter
PorterDuffColorFilter 的构造方法PorterDuffColorFilter(int color,PorterDuff.Mode mode),它表示图像与颜色混合
参数说明:
color 具体的颜色值,如Color.RED
mode 指定PorterDuff.Mode混合模式(图层混合18种模式),mode具体的说明在上一篇文章

3.ColorMatrixColorFilter

ColorMatrixColorFilter有两个构造方法

ColorMatrixColorFilter(float[] colorMatrix)

ColorMatrixColorFilter(ColorMatrix cm)

在构造方法一中,colorMatrix表示4x5的颜色矩阵。

在构造方法二中则传递了ColorMatrix 对象。

ColorMatrixColorFilter它是颜色矩阵。在Android中,系统使用一个颜色矩阵ColorMatrix来处理图像的色彩效果,对于图像的每个像素点,都有一个颜色分量矩阵用来保存颜色的RGBA值(下图C)。Android中的颜色矩阵是一个4x5的数字矩阵(下图A),它用来对图片的色彩进行处理。

Android FeatureLayer高亮 android colorfilter_取值


如果想要改变一个图像的颜色显示效果,那么可以通过矩阵的乘法运算来计算新的颜色值

Android FeatureLayer高亮 android colorfilter_取值_02


利用线性代数的知识,可以得出R1,G1,B1以及A1的值,分别表示计算后新的颜色值。

在矩阵A中,

第一行adcde决定新颜色值的红色(R),

第二行fghij决定新颜色值的绿色(G),

第三行klmno决定新颜色值的蓝色(B),

第四行pqrst决定新颜色值的透明度(A),

第五列ejot决定每个分量(RGBA)的偏移量如果令矩阵A中agms为1,其他均为0,那么得到一个新的矩阵

Android FeatureLayer高亮 android colorfilter_Paint_03


它表示不会对图像的颜色做任何的变化,对应的agms就是RGBA的系数值。

那么,如果我们要修改一个图像的颜色值,1)可以修改ejot偏移量 2)修改agms即RGBA的系数值。

在Api中提供了ColorMatrix 类,主要提供了这几个方法,调节色彩饱和度setSaturation()、色调调节setRotate()、修改RGBA系数值setScale()
在setSaturation(float sat)方法中,sat取值有三个0,1,其他不为1的值,分别表示五色彩(黑白图),默认效果以及饱和度增强
在setRotate(int axis,float degrees)方法中,axis取值同样也有三个0,1,2,分别表示红色,绿色,蓝色,degrees参数则表示旋转角度
在setScale(float rScale,float gScale,float bScale,float aScale)方法中,参数分别表示R、G、B、A的系数值

关于ColorFilter目前就学习了这些,等搞明白了颜色值的计算再来补充