java.lang.Object | |
↳ | android.graphics.ColorFilter |
一、ColorMatrixColorFilter
我就不翻译了,以免出现奇怪的含义,这个类有两个构造函数
[ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ]
我们对Bitmap里的RGBA就行运算
[R, G, B, A],可以的得到以下的结果
R’ = a*R + b*G + c*B + d*A + e; G’ = f*R + g*G + h*B + i*A + j; B’ = k*R + l*G + m*B + n*A + o; A’ = p*R + q*G + r*B + s*A + t;
第一行表示的R(红色)的向量,第二行表示的G(绿色)的向量,第三行表示的B(蓝色)的向量,最后一行表示A(透明度)的向量,这一顺序必须要正确不能混淆!这个矩阵不同的位置表示的RGBA值,其范围在0.0F至2.0F之间,1为保持原图的RGB值。每一行的第五列数字表示偏移值
什么叫偏移值?
我们定义一个色彩矩阵
[ 1, 0, 0, 0, 100, 1, 1, 0, 0, 100, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 ]
与[R, G, B, A]运算后
R’ = R + 100;
G’ = G + 100; B’ = B; A’ = A;
新的颜色值中,红色通道值和绿色通道值分别增加了100,此时图片会泛黄(因为R + G = Yellow)。
这就是偏移值。
上面的是一张原图
我们把它变成灰色
在试试类似反相的效果
我们增大红色的偏移量
二、LightingColorFilter
这两个值也是16进制的数字
R' = R * colorMultiply.R + colorAdd.R G' = G * colorMultiply.G + colorAdd.G B' = B * colorMultiply.B + colorAdd.B
比如我们要去掉红色(R)
new LightingColorFilter(0xFF00FFFF, 0x00000000)
我们增大红色和蓝色的值,让它出现紫色
三、PorterDuffColorFilter
参考:
爱哥的自定义控件很简单
|