1.Android系统将内置滤镜功能
滤镜功能有二十余种不同效果,不逊色于极受欢迎的智能手机应用Instagram所产生的效果。
2.颜色矩阵 ColorMatrix
Android中可以通过颜色矩阵(ColorMatrix类)方面的操作颜色,颜色矩阵是一个5x4 的矩阵。可以用来方面的修改图片中RGBA各分量的值,颜色矩阵以一维数组的方式存储如下:
[ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ]
他通过RGBA四个通道来直接操作对应颜色,如果会使用Photoshop就会知道有时处理图片通过控制RGBA各颜色通道来做出特殊的效果。
矩阵对颜色的作用计算方式:
1.颜色矩阵
|a b c d e|
A = |f g h j i|
|k l m n o|
|p q r s t|
2.颜色分量
|R|
|G|
C=|B| ps:1,2,3行 控制色相
|A| ps:控制透明度
|1| ps:分量的增加值
3.矩阵运算
|R'|
R=|G'|=A*C
|B'|
|A'|
Ps:矩阵的运算规则是矩阵A的一行乘以矩阵C的一列作为矩阵R的一行,
C矩阵是图片中包含的ARGB信息,R矩阵是用颜色矩阵应用于C之后的新的颜色分量,运算结果如下:
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;
3、基本滤镜效果的实现:
如果我们用ColorMatrix调整RGB三种颜色的比重,就可以实现诸如单色、黑白的效果。
通过ColorMatrix改变图像数值,生成变换矩阵,利用矩阵相乘,来改变每个点的像素值。
Matrix =>
r1 r2 r3 r4 r5
g1 g2 g3 g4 g5
b1 b2 b3 b4 b5
a1 a2 a3 a4 a5
变化以后
R' = R * r1 + G * r2 + B * r3 + A * r4 + r5;
G' = R * g1 + G * g2 + B *g3 + A * g4 + g5;
B' = R * b1 + G * b2 + B *b3 + A * b4 + b5;
A' = R * a1 + G * a2 + B * a3 + A * a4 + a5;
ps:第1~3列是控制色相的,第4列是控制透明度的,第5列是分量的增加值
当R、G、B、A系数值变化会修改图像的效果,比如:
(1)对角线值为1.0,其他为0时,图像保证的是原图像
|R 1.0 0 0 0 0|
|G 0 1.0 0 0 0|
|B 0 0 1.0 0 0|
|A 0 0 0 1.0 0|
(2)对角线值若大于1.0,其他为0时,图像偏亮
|R 2.0 0 0 0 0|
|G 0 2.0 0 0 0|
|B 0 0 2.0 0 0|
|A 0 0 0 2.0 0|
(3)对角线值若小于1.0,其他为0时,图像偏暗
|R 0.5 0 0 0 0|
|G 0 0.5 0 0 0|
|B 0 0 0.5 0 0|
|A 0 0 0 0.5 0|
(4)设定图像为灰色,通过查资料 R 0.3 G0.59 B 0.11
|R 0.3f 0.59f 0.11f 0 0|
|G 0.3f 0.59f 0.11f 0 0|
|B 0.3f 0.59f 0.11f 0 0|
|A 0 0 0 0.1 0|
在代码中实现的:
public Bitmap getBlackStyle(Bitmap src){
Bitmap style = Bitmap.createBitmap(src.getWidth(),src.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(style );
ColorMatrix cm = new ColorMatrix();
//设定图像为灰色,通过查资料 R 0.3 G0.59 B 0.11
cm.set(new float[] {
0.3f, 0.59f, 0.11f, 0, 0,
0.3f, 0.59f, 0.11f, 0, 0,
0.3f, 0.59f, 0.11f, 0, 0,
0, 0, 0, 1, 0 });
Paint paint = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(src, 0, 0, paint);
// 保存图像
canvas.save(Canvas.ALL_SAVE_FLAG);
// 存储
canvas.restore();
return style;
}