Android Camera 实现滤镜方法

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;  
    } 






猜你喜欢

转载自blog.csdn.net/alin693/article/details/66498566
今日推荐