1. 程式人生 > >Android Camera 實現濾鏡方法

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