Android Camera 實現濾鏡方法
阿新 • • 發佈:2019-01-29
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|
濾鏡功能有二十餘種不同效果,不遜色於極受歡迎的智慧手機應用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;
}