Android系統將內建濾鏡功能

凌風探梅發表於2016-03-18

from: http://cblog.cc/2015/09/03/Android-Camera-%E5%AE%9E%E6%97%B6%E6%BB%A4%E9%95%9C/

一、Android系統將內建濾鏡功能

濾鏡功能有二十餘種不同效果,不遜色於極受歡迎的智慧手機應用Instagram所產生的效果。

1、顏色矩陣 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各顏色通道來做出特殊的效果。

這個矩陣對顏色的作用計算方式如示:

矩陣的運算規則是矩陣A的一行乘以矩陣C的一列作為矩陣R的一行,

C矩陣是圖片中包含的ARGB資訊,R矩陣是用顏色矩陣應用於C之後的新的顏色分量,運算結果如下:

R’ = aR + bG + cB + dA + e;
G’ = fR + gG + hB + iA + j;
B’ = kR + lG + mB + nA + o;
A’ = pR + qG + rB + sA + t;

Ps:第1~3列是控制色相的,第4列是控制透明度的,第5列是分量的增加值。

2、基本濾鏡效果的實現:

如果我們用ColorMatrix調整RGB三種顏色的比重,就可以實現諸如單色、黑白的效果。

3、Lomo濾鏡效果的實現:

改變影象數值+遮罩

二、Android平臺濾鏡

濾鏡這個功能在目前的市場上應用很廣泛,發展也非常快,總結起來,基本上有以下三種應用會包含濾鏡功能,都各有所長。

#

二、相機濾鏡介紹

1、相機360鏡介紹

相機360的濾鏡特效類別比較多,每一類別又分為不同的特效。

其最主要的特點是它具有實時拍照濾鏡功能,且在關閉重新進入後可記憶之前選擇的濾鏡。

缺點是濾鏡效果一般,而且選擇濾鏡的互動比較複雜,不好操作。

2、魔幻時刻相機濾鏡介紹(靜態濾鏡)

魔幻時刻相機Magic Hour是一款從ios移植過來的優秀拍照軟體。

從其濾鏡管理和濾鏡庫的豐富程度就可以看出這款相機的偏重點了!具有大量的濾鏡效果且支援下載。濾鏡管理頁面很“整潔”,易操作。

三、圖片美化濾鏡

在圖片美化界,美圖秀秀是當之無愧的NO.1,其濾鏡效果按照tab頁的方式分為幾類供選擇,操作非常直觀,且每一種特效都會有非常漂亮的效果。

Pixlr-0-matic,這款圖片處理工具的濾鏡不管從UI設計來講還是從互動來講都非常贊,而且它的濾鏡還有增加光影效果、色相效果等功能,美化照片能力超強。

四、社交分享濾鏡

社交應用也越來越注重圖片分享時的濾鏡功能。
騰訊微博的濾鏡效果如圖,互動簡潔,清爽,濾鏡效果很佳,一推出便得到廣泛應用和讚揚。

Path是得到普遍認可的優秀產品,包括其濾鏡效果。
簡潔是社交分享濾鏡的最主要特點,path的濾鏡也承襲了這一風格,且濾鏡效果很佳。

五、總結

1、採用實時拍照濾鏡,在成相的同時可以使使用者看到自己想要的照片效果。

2、濾鏡種類不宜過多,把握關鍵的最受使用者喜歡的濾鏡效果,比如:素描、油畫、炫彩、老照片等經典效果。

3、追求高質量濾鏡效果,我們要讓每一個濾鏡都能夠使照片變得更加漂亮,而不是雞肋效果。

4、互動上儘量簡潔,一目瞭然,避免多重選擇和切換。

七、基於Android平臺基本濾鏡演算法的實現

1、Android提供了改變影象數值的方法ColorMatrix,通過ColorMatrix方法可以實現基本濾鏡,如黑白、灰色、泛黃等效果。

2、通過ColorMatrix改變影象數值,生成變換矩陣,利用矩陣相乘,來改變每個點的畫素值。

Matrix =>

r1 r2 r3 r4
g1 g2 g3 g4
b1 b2 b3 b4
a1 a2 a3 a4

變化以後

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;

第1~3列是控制色相的,第4列是控制透明度的,第5列是分量的增加值

3、R、G、B、A係數值變化會修改影象的效果

(1)對角線值為1.0,其他為0時,影象保證的是原影象

(2)對角線值若大於1.0,其他為0時,影象偏亮

(3)對角線值若小於1.0,其他為0時,影象偏暗

(4)設定影象為灰色,通過查資料 R 0.3 G0.59 B 0.11

4、根據以上的實現,實現基本濾鏡的演算法是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public Bitmap getBlackStyle(Bitmap src){

Bitmap dst = Bitmap.createBitmap(src.getWidth(),src.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(dst);
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 dst;
}

八、後濾鏡時代

在網上看到一些資訊和相機應用,很多相機玩家對手機相機的使用是越來越多,作為手機相機的開發者需要有更多的創意和特性為手機相機添彩!如下幾點相機的發展方向供大家參考:

(1)實時濾鏡

VIDA 是一款來自國內團隊的照相應用,它的一大特色就是實時濾鏡,在拍攝的同時你已經可以
預覽到最終的成品。這是一個強化濾鏡功能的方向。和單純的加入新濾鏡不同,實時濾鏡把握住了
所見即所得的精髓。

(2)GIF 動畫

GIFshop 是 一款快速製作定格動畫的應用。它結合了動態畫面的敘事能力,保留了圖片的小體積特點。但 GIFshop 的問題也非常突出,比起記錄生活,它更適合於創作一些幽默的動態小品。一旦涉及到 “創作” ,使用者的門檻就被無情地提高了。但讓畫面動起來的想法要比單純的強化濾鏡要走的更遠一些。

(3)動態圖片
Cinemagram 制 作出來的圖片可以只在某一特定區域中出現動態效果。你可以那它建立那種網
上流行的“會動的海報”。比起 GIFshop ,它能夠讓普通的記事照片變得有點魔幻。由於應用的
構思巧妙,因此適合套用在不同的場合中。使用者的門檻相對較小,但收穫卻是挺大的。我將其看作是 GIFshop 的改進版本。

(4)聲音+圖片

Picle 是 一款讓你在拍攝相片的同時也記錄下一段音訊的應用。它的好處是讓 “畫外音” 這一有趣的角色參與照片的敘事。相比上述應用,Picle 進入了另個維度,它考慮到圖片的敘事瓶頸,並試圖通過加入音訊來突破。Picle 所面臨的問題是,它建立了一種新的格式,而這種格式目前還只能在 Picle 體系內分享。

後濾鏡時代裡各支團隊在不同方向上設定了不同的瓶頸,並通過一定的方法來突破。思考的起點無一例外的定在了增強圖片敘事能力之上。從目前的情況來看,有一些事項值得注意:

· 體積:不能因為增強了效果而變得臃腫。

· 題材:不能因為特別適合某種題材而狹隘了使用者的使用場景。

· 格式:在現有流行的格式上入手,避免使用新格式。

· 門檻:在使用者利益和使用複雜度上尋求平衡。

· 多媒體:在圖片上做加法,但不能演變成拍攝視訊。

 相信隨著硬體技術的增強,手機將成為一類新的照相裝置。它也許替代不了傳統的相機,但
它卻能因為應用而變得不可替代。而可以預見的是,濾鏡不會是手機照相的最後一站。

九,基於Android平臺PS特效的自定義演算法的實現

在ARGB顏色空間,分別使用A(Transparency)、R(Red)、G(Green)、B(Blue)四個值來描述一個畫素點,那麼對於一個寬w高h的圖片來說,共有wh個畫素點,可以用一個陣列物件int [] pixels來表示相應的圖片,pixels = { p1,p2,p3…}。在把各個畫素點都用ARGB來表示,那麼這張圖片就可以用一個[wh,4]的矩陣來描述:

1
2
3
4
5
6
pixels = {
pa1,pr1,pg1,pb1,
pa2,pr2,pg2,pb2,
pa3,pr3,pg3,pb3,
……
}

android平臺在獲取畫素方面提供了 Bitmap.getPixels 方法,我需要做的是遍歷影象的畫素點,對每一個畫素點進行計算。然後將計算完的畫素點通過Color.red/green/blue 方法處理後,將畫素點填回Bitmap,從而得到濾鏡後的影象。這種方式比ColorMatrix 要靈活,可以滿足PS特效的實現效果。

1、簡單的反色濾鏡實現

取出圖片的畫素點,然後用255減去每個畫素點,那麼得到的就是一張有反色效果的圖片

演算法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* @author neil
*/

public class AntiColorFilter implements ImageFilterInterface {

private ImageData image = null; // 圖片資訊類

public AntiColorFilter(Bitmap bmp) {
image = new ImageData(bmp);
}

public ImageData imageProcess() {
int width = image.getWidth();
int height = image.getHeight();
int R, G, B, pixel;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
R = image.getRComponent(x, y); // 獲取RGB三原色
G = image.getGComponent(x, y);
B = image.getBComponent(x, y);

R = 255 - R;
B = 255 - B;
G = 255 - G;

image.setPixelColor(x, y, R, G, B);
} // x
} // y
return image;
}
}

2、油畫濾鏡的實現

通過查資料瞭解到油畫濾鏡的演算法是”用當前點四周一定範圍內任意一點的顏色來替代當前點顏色,最常用的是隨機的採用相鄰點進行替代”

演算法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public ImageData imageProcess() {
int width = image.getWidth();
int height = image.getHeight();
int R, G, B, pixel,xx = 0,yy = 0;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int pos = getRandomInt(1, 10000) % Model;
xx = (x + pos) < width ? (x + pos) : (x - pos) >= 0 ? (x - pos) : x;
yy = (y + pos) < height ? (y + pos) : (y - pos) >= 0 ? (y - pos) : y;

R = image.getRComponent(xx, yy); // 獲取RGB三原色
G = image.getGComponent(xx, yy);
B = image.getBComponent(xx, yy);

image.setPixelColor(x, y, R, G, B);
} // x
} // y

return image;
}

public static int getRandomInt(int a, int b) {
int min = Math.min(a, b);
int max = Math.max(a, b);
return min + (int)(Math.random() * (max - min + 1));
}

3、冰凍濾鏡的實現

冰凍濾鏡的演算法是將畫素點顏色加深,每個象素都用RGB三原色來表示,(0,0,0)就是純黑,而(255,255,255)就是純白,因此將沒個畫素點的RGB指變小,顏色就會加深

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
int width = image.getWidth();
int height = image.getHeight();
int R, G, B, pixel;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
R = image.getRComponent(x, y); // 獲取RGB三原色
G = image.getGComponent(x, y);
B = image.getBComponent(x, y);

pixel = R - G - B;
pixel = pixel * 3 / 2;
if (pixel < 0)
pixel = -pixel;
if (pixel > 255)
pixel = 255;
R = pixel;


pixel = G - B - R;
pixel = pixel * 3 / 2;
if (pixel < 0)
pixel = -pixel;
if (pixel > 255)
pixel = 255;
G = pixel;


pixel = B - R - G;
pixel = pixel * 3 / 2;
if (pixel < 0)
pixel = -pixel;
if (pixel > 255)
pixel = 255;
B = pixel;

image.setPixelColor(x, y, R, G, B);
} // x
} // y

Android 靜態濾鏡的實現

一、回顧知識點

1、基本濾鏡效果的實現(黑白濾鏡)

用到的技術是ColorMatrix。通過改變RGBA的係數,從而改變影象的成像效果。

2、PS濾鏡效果的實現(反色效果、冰凍效果、油畫效果)

用到的技術是通過遍歷影象的畫素點,設定影象的畫素點的RGB三原色來實現PS效果。

二、靜態濾鏡的實現

基於之前積累下來的知識點,在對靜態濾鏡的實現方面做一下提升,還是從兩方面進行實現。

1、基本濾鏡效果升級版 –> 偽lomo濾鏡的實現

  • step1:原始圖片

  • step2:ColorMatrix處理

  • step3:在處理後的圖片上覆蓋一層彩色lomo圖片

  • step4:覆蓋上彩色lomo後的效果

  • step5:偽lomo濾鏡效果

2、PS濾鏡效果升級版 –> 老照片濾鏡的實現

(1)HSL顏色標準

  • HSL色彩模式是工業界的一種顏色標準,是通過對色調(H)、飽和度(S)、亮度(L)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏 色的,HSL即是代表色調,飽和度,亮度三個通道的顏色,這個標準幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統之一。   
  • HSL色彩模式使用HSL模型為影象中每一個畫素的HSL分量分配一個0~255範圍內的強度值。HSL影象只使用三種通道,就可以使它們按照不同的比例混合,在螢幕上重現16777216種顏色。   
  • 在 HSL 模式下,每種 HSL 成分都可使用從 0到 255的值。(其中L是從黑(0)到白(255)漸變) 。

老照片效果的總體思路是,對色調、飽和度、亮度進行處理,而非之前的紅綠藍色調處理。

(2)演算法實現

  • 效果圖

HSL色彩模式


1、顏色HSL

H: hue 色調   
: saturation 飽和度    
L: lum 亮度

2、概述

  • HSL色彩模式是工業界的一種顏色標準,是通過對色調(H)、飽和度(S)、亮度(L)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,HSL即是代表色調,飽和度,亮度三個通道的顏色,這個標準幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統之一。   
  • HSL色彩模式使用HSL模型為影象中每一個畫素的HSL分量分配一個0~255範圍內的強度值。HSL影象只使用三種通道,就可以使它們按照不同的比例混合,在螢幕上重現16777216種顏色。   
  • 在 HSL 模式下,每種 HSL 成分都可使用從 0到 255的值。(其中L是從黑(0)到白(255)漸變) 。

3、HSL與RGB轉換

a. RGB→HSL的演算法描述

步驟1:把RGB值轉成【0,1】中數值。 

步驟2:找出R,G和B中的最大值。 

步驟3:設L=(maxcolor + mincolor)/2 

步驟4:如果最大和最小的顏色值相同,即表示灰色,那麼S定義為0,而H未定義並在程式中通常寫成0。 

步驟5:否則,測試L: 

  If L<0.5, s="(maxcolor-mincolor)/(maxcolor" +="" mincolor)="" <="" br="">
  If L>=0.5, S=(maxcolor-mincolor)/(2.0-maxcolor-mincolor) 

步驟6: If R=maxcolor, H=(G-B)/(maxcolor-mincolor) 

  If G=maxcolor, H=2.0+(B-R)/(maxcolor-mincolor) 

  If B=maxcolor, H=4.0+(R-G)/(maxcolor-mincolor) 

步驟7:從第6步的計算看,H分成0~6區域。RGB顏色空間是一個立方體而HSL顏色空間是兩個六角形 錐體,其中的L是RGB立方體的主對角線。因此,RGB立方體的頂點:紅、黃、綠、青、藍和品紅就成為HSL六角形的頂點,而數值0~6就告訴我們H在哪個部分。H=H*60.0,如果H為負值,則加360。

b. HSL→RGB的演算法描述

步驟1:If S=0,表示灰色,定義R,G和B都為L. 

步驟2:否則,測試L: 

   If L<0.5,temp2=l*(1.0+s) <="" br="">
   If L>=0.5,temp2=L+S-L

步驟3:temp1=2.0
-temp2 

步驟4:把H轉換到0~1。 

步驟5:對於R,G,B,計算另外的臨時值temp3。方法如下: 

   for R, temp3=H+1.0/3.0 

   for G, temp3=H 

   for B, temp3=H-1.0/3.0 

   if temp3<0, temp3="temp3+1.0" <="" br="">
   if temp3>1, temp3=temp3-1.0 

步驟6:對於R,G,B做如下測試: 

   If 6.0temp3<1,color=temp1+(temp2-temp1)6.0temp3 

   Else if 2.0
temp3<1,color=temp2 <="" br="">
   Else if 3.0temp3<2, <="" br="">
   color=temp1+(temp2-temp1)
((2.0/3.0)-temp3)*6.0 

   Else color=temp1 

  • 例項



HSL色彩模式與RGB色彩模式轉換程式碼實現

RGB色彩模式

HSL色彩模式

HSL色彩模式與RGB色彩模式轉換演算法

HSL與RGB轉換

  • RGB類

    1
    2
    3
    4
    5
    6
    7
    public class ColorRGB {

    public int r;
    public int g;
    public int b;

    }
  • HSL類

    1
    2
    3
    4
    5
    6
    7
     public class ColorHSL {

    public int h;
    public float s;
    public float l;

    }

a) RGB→HSL的演算法描述。

步驟1:把RGB值轉成【0,1】中數值。 

步驟2:找出R,G和B中的最大值。 

步驟3:設L=(maxcolor + mincolor)/2 

步驟4:如果最大和最小的顏色值相同,即表示灰色,那麼S定義為0,而H未定義並在程 序中通常寫成 0。 

步驟5:否則,測試L: 

  If L<0.5, s="(maxcolor-mincolor)/(maxcolor" +="" mincolor)="" 

  If L>=0.5, S=(maxcolor-mincolor)/(2.0-maxcolor-mincolor) 

步驟6: If R=maxcolor, H=(G-B)/(maxcolor-mincolor) 

  If G=maxcolor, H=2.0+(B-R)/(maxcolor-mincolor) 

  If B=maxcolor, H=4.0+(R-G)/(maxcolor-mincolor) 

步驟7:從第6步的計算看,H分成0~6區域。RGB顏色空間是一個立方體而HSL顏色空間是兩個六角形錐體,其中的L是RGB立方體的主對角線。因此,RGB立方體的頂點:紅、黃、綠、青、藍和品紅就成為HSL六角形的頂點,而數值0~6就告訴我們H在哪個部分。H=H*60.0,如果H為負值,則加360。 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
private static ColorHSL colorRGBToHSL(ColorRGB rgb) {

ColorHSL hsl = new ColorHSL();

float r, g, b, h, s, l;
r = rgb.r / 255.0f;
g = rgb.g / 255.0f;
b = rgb.b / 255.0f;

float maxColor = Math.max(r, Math.max(g, b));
float minColor = Math.min(r, Math.min(g, b));

if (maxColor == minColor) {
h = 0.0f;
s = 0.0f;
l = r;
} else {
l = (minColor + maxColor) / 2;

if (l < 0.5)
s = (maxColor - minColor) / (maxColor + minColor);
else
s = (float) ((maxColor - minColor) / (2.0 - maxColor -
minColor));

if (r == maxColor)
h = (g - b) / (maxColor - minColor);
else if (g == maxColor)
h = (float) (2.0 + (b - r) / (maxColor - minColor));
else
h = (float) (4.0 + (r - g) / (maxColor - minColor));

h /= 6;
if (h < 0)
h++;
}

hsl.h = (int) Math.round(h * 360.0);
hsl.s = s;
hsl.l = l;

return hsl;
}

b) HSL→RGB的演算法描述

步驟1:If S=0,表示灰色,定義R,G和B都為L. 

步驟2:否則,測試L: 

   If L<0.5,temp2=l*(1.0+s) 

   If L>=0.5,temp2=L+S-L

步驟3:temp1=2.0
-temp2 

步驟4:把H轉換到0~1。 

步驟5:對於R,G,B,計算另外的臨時值temp3。方法如下: 

   for R, temp3=H+1.0/3.0 

   for G, temp3=H 

   for B, temp3=H-1.0/3.0 

   if temp3<0, temp3="temp3+1.0" 

   if temp3>1, temp3=temp3-1.0 

步驟6:對於R,G,B做如下測試: 

   If 6.0temp3<1,color=temp1+(temp2-temp1)6.0temp3 

   Else if 2.0
temp3<1,color=temp2 

   Else if 3.0temp3<2, 

   color=temp1+(temp2-temp1)
((2.0/3.0)-temp3)*6.0 

   Else color=temp1 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
private static ColorRGB colorHSLToRGB(ColorHSL hsl) {

ColorRGB rgb = new ColorRGB();

float r, g, b, h, s, l;
float temp1, temp2, tempr, tempg, tempb;
h = hsl.h / 360.0f;
s = hsl.s;
l = hsl.l;


if (s == 0) {
r = g = b = l;
} else {
if (l < 0.5)
temp2 = l * (1 + s);
else
temp2 = (l + s) - (l * s);
temp1 = 2 * l - temp2;
tempr = (float) (h + 1.0 / 3.0);
if (tempr > 1)
tempr--;
tempg = h;
tempb = (float) (h - 1.0 / 3.0);
if (tempb < 0)
tempb++;

// Red
if (tempr < 1.0 / 6.0)
r = (float) (temp1 + (temp2 - temp1) * 6.0 * tempr);
else if (tempr < 0.5)
r = temp2;
else if (tempr < 2.0 / 3.0)
r = (float) (temp1 + (temp2 - temp1) * ((2.0 / 3.0) - tempr)
* 6.0);
else
r = temp1;

// Green
if (tempg < 1.0 / 6.0)
g = (float) (temp1 + (temp2 - temp1) * 6.0 * tempg);
else if (tempg < 0.5)
g = temp2;
else if (tempg < 2.0 / 3.0)
g = (float) (temp1 + (temp2 - temp1) * ((2.0 / 3.0) - tempg)
* 6.0);
else
g = temp1;

// Blue
if (tempb < 1.0 / 6.0)
b = (float) (temp1 + (temp2 - temp1) * 6.0 * tempb);
else if (tempb < 0.5)
b = temp2;
else if (tempb < 2.0 / 3.0)
b = (float) (temp1 + (temp2 - temp1) * ((2.0 / 3.0) - tempb)
* 6.0);
else
b = temp1;
}

rgb.r = (int) Math.round(r * 255.0);
rgb.g = (int) Math.round(g * 255.0);
rgb.b = (int) Math.round(b * 255.0);

return rgb;
}

Android Camera可以做哪些?

1、功能

  • 拍攝相片
  • 視訊錄製
  • 取景器(掃描類應用,如人臉識別,名片識別,條形碼識別)

2、根據Camera API實現自己的拍照程式,共7步

Camera Preview是什麼?

攝像頭返回的RAW資料經過isp處理後形成yuv資料,android系統將該資料繪製到取景區上,不斷繪製幀資料形成實時預覽資料。

如何獲取Camera Preview中的資料?

  • Camera.PreviewCallback
  • setPreviewCallback 

    螢幕上顯示一個新的預覽幀時呼叫onPreviewFrame方法(時時獲取)
  • setPreviewCallbackWithBuffer 

    其與setPreviewCallback的工作方式相同,但要求指定一個位元組數 

    組作為緩衝區,用於預覽影象資料(addCallbackBuffer)

Android Camera 實時濾鏡怎麼做?

YUV轉RGB的演算法,轉換的公式一般如下,也是線性的關係: 

R = Y + 1.14V 

G = Y - 0.39U - 0.58V 

B = Y + 2.03U 

問題 

1、螢幕卡頓,使用者體驗低 

2、效能低,影響系統效能 



如何優化? 

  • 提高流程度 

    影象渲染採用OpenGL ES SurfaceTexture 
  • 提高效能 

    GPU優化 

相關文章