Android 颜色

记录对Android的颜色处理学习笔记

颜色过滤

如果想给画笔画出来的图像加上一个滤镜效果, 可以使用

1
paint.setColorFilter(ColorFilter filter);

参数ColorFilter类本身没有任何方法内容, 但是有三个子类提供不同模式的过滤器, 只提供构造方法创建对象不提供任何公开成员:

  1. ColorMatrixColorFilter 颜色矩阵过滤器
  2. LightingColorFilter 光源颜色过滤器
  3. PorterDuffColorFilter 过渡颜色过滤器

ColorMatrixColorFilter

1
2
ColorMatrixColorFilter(ColorMatrix matrix) // 4*5 使用颜色矩阵对象
ColorMatrixColorFilter(float[] array) // 4*5 直接使用浮点数组

两个构造方法本质一样, 都是通过4*5浮点数组创建颜色矩阵. ColorMatrix也是通过浮点数组创建对象, 且有setter设置颜色饱和度/比例/色相等(原理只是根据算法修改矩阵).

ColorMatrix

通过算法修改矩阵中的值可以达到如同ps软件等的色相/饱和度/比例等图像调整效果. 可以将4*5浮点数组看做如下表达式:

1
2
3
4
5
// 浮点数范围并没有限制
[ a, b, c, d, e, // R
f, g, h, i, j, // G
k, l, m, n, o, // B
p, q, r, s, t ] // A

最终显示在屏幕上的颜色的结果计算公式:

1
2
3
4
R’ = a*R + b*G + c*B + d*A + e; // 公式最后的结果<=256且>=0
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;

从公式可以看出数组中4行为对应改变四种颜色通道. 根据原始颜色的每个颜色通道值计算出新的颜色通道混合得到最终的颜色.

每行前四浮点值分别改变颜色的四个颜色通道, 最后的浮点值为偏移值

以下为原始颜色示例, 没有任何滤镜效果

1
2
3
4
5
6
7
ColorMatrix colorMatrix = new ColorMatrix(new float[]{
1, 0, 0, 0, 0,
0, 1, 0, 0, 0,
0, 0, 1, 0, 0,
0, 0, 0, 1, 0,
});
// 完全复制原始颜色的RGBA颜色通道值

LightingColorFilter

光源过滤器对alpha通道不造成影响

1
LightingColorFilter(int mul, int add);
Parameters
mul 官方介绍为色彩倍增(colorMultiply), 参数为16进制RGB颜色值
add 官方介绍为色彩增加(colorAdd), 参数为16进制RGB颜色值

最终显示颜色计算公式:

1
2
3
 R' = R * colorMultiply.R + colorAdd.R
 G' = G * colorMultiply.G + colorAdd.G
 B' = B * colorMultiply.B + colorAdd.B

从结果可以看出光源过滤器只对原有的颜色进行倍增和偏移

举例:

1
2
new LightingColorFilter(0xFFFFFFFF, 0x00000000)
// 此过滤器不改变颜色, 即使把我alpha通道值加上也并不会改变alpha

PorterDuffColorFilter

此颜色过滤器相当于PS中的图层混合模式

1
PorterDuffColorFilter(int color, PorterDuff.Mode mode)
参数 描述
color 16进制颜色值
mode PorterDuff.Mode枚举中包含很多的模式