Android系统将内置滤镜功能
from:?http://cblog.cc/2015/09/03/Android-Camera-%E5%AE%9E%E6%97%B6%E6%BB%A4%E9%95%9C/
一、Android系統(tǒng)將內(nèi)置濾鏡功能
濾鏡功能有二十余種不同效果,不遜色于極受歡迎的智能手機應(yīng)用Instagram所產(chǎn)生的效果。
1、顏色矩陣 ColorMatrix
android中可以通過顏色矩陣(ColorMatrix類)方面的操作顏色,顏色矩陣是一個5x4 的矩陣。可以用來方面的修改圖片中RGBA各分量的值,顏色矩陣以一維數(shù)組的方式存儲如下:
[ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ]
他通過RGBA四個通道來直接操作對應(yīng)顏色,如果會使用Photoshop就會知道有時處理圖片通過控制RGBA各顏色通道來做出特殊的效果。
這個矩陣對顏色的作用計算方式如示:
矩陣的運算規(guī)則是矩陣A的一行乘以矩陣C的一列作為矩陣R的一行,
C矩陣是圖片中包含的ARGB信息,R矩陣是用顏色矩陣應(yīng)用于C之后的新的顏色分量,運算結(jié)果如下:
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、基本濾鏡效果的實現(xiàn):
如果我們用ColorMatrix調(diào)整RGB三種顏色的比重,就可以實現(xiàn)諸如單色、黑白的效果。
3、Lomo濾鏡效果的實現(xiàn):
改變圖像數(shù)值+遮罩
二、Android平臺濾鏡
濾鏡這個功能在目前的市場上應(yīng)用很廣泛,發(fā)展也非常快,總結(jié)起來,基本上有以下三種應(yīng)用會包含濾鏡功能,都各有所長。
#
二、相機濾鏡介紹
1、相機360鏡介紹
相機360的濾鏡特效類別比較多,每一類別又分為不同的特效。
其最主要的特點是它具有實時拍照濾鏡功能,且在關(guān)閉重新進入后可記憶之前選擇的濾鏡。
缺點是濾鏡效果一般,而且選擇濾鏡的交互比較復(fù)雜,不好操作。
2、魔幻時刻相機濾鏡介紹(靜態(tài)濾鏡)
魔幻時刻相機Magic Hour是一款從ios移植過來的優(yōu)秀拍照軟件。
從其濾鏡管理和濾鏡庫的豐富程度就可以看出這款相機的偏重點了!具有大量的濾鏡效果且支持下載。濾鏡管理頁面很“整潔”,易操作。
三、圖片美化濾鏡
在圖片美化界,美圖秀秀是當之無愧的NO.1,其濾鏡效果按照tab頁的方式分為幾類供選擇,操作非常直觀,且每一種特效都會有非常漂亮的效果。
Pixlr-0-matic,這款圖片處理工具的濾鏡不管從UI設(shè)計來講還是從交互來講都非常贊,而且它的濾鏡還有增加光影效果、色相效果等功能,美化照片能力超強。
四、社交分享濾鏡
社交應(yīng)用也越來越注重圖片分享時的濾鏡功能。
騰訊微博的濾鏡效果如圖,交互簡潔,清爽,濾鏡效果很佳,一推出便得到廣泛應(yīng)用和贊揚。
Path是得到普遍認可的優(yōu)秀產(chǎn)品,包括其濾鏡效果。
簡潔是社交分享濾鏡的最主要特點,path的濾鏡也承襲了這一風格,且濾鏡效果很佳。
五、總結(jié)
1、采用實時拍照濾鏡,在成相的同時可以使用戶看到自己想要的照片效果。
2、濾鏡種類不宜過多,把握關(guān)鍵的最受用戶喜歡的濾鏡效果,比如:素描、油畫、炫彩、老照片等經(jīng)典效果。
3、追求高質(zhì)量濾鏡效果,我們要讓每一個濾鏡都能夠使照片變得更加漂亮,而不是雞肋效果。
4、交互上盡量簡潔,一目了然,避免多重選擇和切換。
七、基于Android平臺基本濾鏡算法的實現(xiàn)
1、Android提供了改變圖像數(shù)值的方法ColorMatrix,通過ColorMatrix方法可以實現(xiàn)基本濾鏡,如黑白、灰色、泛黃等效果。
2、通過ColorMatrix改變圖像數(shù)值,生成變換矩陣,利用矩陣相乘,來改變每個點的像素值。
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系數(shù)值變化會修改圖像的效果
(1)對角線值為1.0,其他為0時,圖像保證的是原圖像
(2)對角線值若大于1.0,其他為0時,圖像偏亮
(3)對角線值若小于1.0,其他為0時,圖像偏暗
(4)設(shè)定圖像為灰色,通過查資料 R 0.3 G0.59 B 0.11
4、根據(jù)以上的實現(xiàn),實現(xiàn)基本濾鏡的算法是
| 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(); //設(shè)定圖像為灰色,通過查資料 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; } |
八、后濾鏡時代
在網(wǎng)上看到一些信息和相機應(yīng)用,很多相機玩家對手機相機的使用是越來越多,作為手機相機的開發(fā)者需要有更多的創(chuàng)意和特性為手機相機添彩!如下幾點相機的發(fā)展方向供大家參考:
(1)實時濾鏡
VIDA 是一款來自國內(nèi)團隊的照相應(yīng)用,它的一大特色就是實時濾鏡,在拍攝的同時你已經(jīng)可以
預(yù)覽到最終的成品。這是一個強化濾鏡功能的方向。和單純的加入新濾鏡不同,實時濾鏡把握住了
所見即所得的精髓。
(2)GIF 動畫
GIFshop 是 一款快速制作定格動畫的應(yīng)用。它結(jié)合了動態(tài)畫面的敘事能力,保留了圖片的小體積特點。但 GIFshop 的問題也非常突出,比起記錄生活,它更適合于創(chuàng)作一些幽默的動態(tài)小品。一旦涉及到 “創(chuàng)作” ,用戶的門檻就被無情地提高了。但讓畫面動起來的想法要比單純的強化濾鏡要走的更遠一些。
(3)動態(tài)圖片
Cinemagram 制 作出來的圖片可以只在某一特定區(qū)域中出現(xiàn)動態(tài)效果。你可以那它創(chuàng)建那種網(wǎng)
上流行的“會動的海報”。比起 GIFshop ,它能夠讓普通的記事照片變得有點魔幻。由于應(yīng)用的
構(gòu)思巧妙,因此適合套用在不同的場合中。用戶的門檻相對較小,但收獲卻是挺大的。我將其看作是 GIFshop 的改進版本。
(4)聲音+圖片
Picle 是 一款讓你在拍攝相片的同時也記錄下一段音頻的應(yīng)用。它的好處是讓 “畫外音” 這一有趣的角色參與照片的敘事。相比上述應(yīng)用,Picle 進入了另個維度,它考慮到圖片的敘事瓶頸,并試圖通過加入音頻來突破。Picle 所面臨的問題是,它建立了一種新的格式,而這種格式目前還只能在 Picle 體系內(nèi)分享。
后濾鏡時代里各支團隊在不同方向上設(shè)定了不同的瓶頸,并通過一定的方法來突破。思考的起點無一例外的定在了增強圖片敘事能力之上。從目前的情況來看,有一些事項值得注意:
· 體積:不能因為增強了效果而變得臃腫。
· 題材:不能因為特別適合某種題材而狹隘了用戶的使用場景。
· 格式:在現(xiàn)有流行的格式上入手,避免使用新格式。
· 門檻:在用戶利益和使用復(fù)雜度上尋求平衡。
· 多媒體:在圖片上做加法,但不能演變成拍攝視頻。
相信隨著硬件技術(shù)的增強,手機將成為一類新的照相設(shè)備。它也許替代不了傳統(tǒng)的相機,但 它卻能因為應(yīng)用而變得不可替代。而可以預(yù)見的是,濾鏡不會是手機照相的最后一站。九,基于Android平臺PS特效的自定義算法的實現(xiàn)
在ARGB顏色空間,分別使用A(Transparency)、R(Red)、G(Green)、B(Blue)四個值來描述一個像素點,那么對于一個寬w高h的圖片來說,共有wh個像素點,可以用一個數(shù)組對象int [] pixels來表示相應(yīng)的圖片,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特效的實現(xiàn)效果。
1、簡單的反色濾鏡實現(xiàn)
取出圖片的像素點,然后用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、油畫濾鏡的實現(xiàn)
通過查資料了解到油畫濾鏡的算法是”用當前點四周一定范圍內(nèi)任意一點的顏色來替代當前點顏色,最常用的是隨機的采用相鄰點進行替代”
算法如下:
| 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、冰凍濾鏡的實現(xiàn)
冰凍濾鏡的算法是將像素點顏色加深,每個象素都用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 靜態(tài)濾鏡的實現(xiàn)
一、回顧知識點
1、基本濾鏡效果的實現(xiàn)(黑白濾鏡)
用到的技術(shù)是ColorMatrix。通過改變RGBA的系數(shù),從而改變圖像的成像效果。
2、PS濾鏡效果的實現(xiàn)(反色效果、冰凍效果、油畫效果)
用到的技術(shù)是通過遍歷圖像的像素點,設(shè)置圖像的像素點的RGB三原色來實現(xiàn)PS效果。
二、靜態(tài)濾鏡的實現(xiàn)
基于之前積累下來的知識點,在對靜態(tài)濾鏡的實現(xiàn)方面做一下提升,還是從兩方面進行實現(xiàn)。
1、基本濾鏡效果升級版 –> 偽lomo濾鏡的實現(xiàn)
-
step1:原始圖片
-
step2:ColorMatrix處理
-
step3:在處理后的圖片上覆蓋一層彩色lomo圖片
-
step4:覆蓋上彩色lomo后的效果
-
step5:偽lomo濾鏡效果
2、PS濾鏡效果升級版 –> 老照片濾鏡的實現(xiàn)
(1)HSL顏色標準
- HSL色彩模式是工業(yè)界的一種顏色標準,是通過對色調(diào)(H)、飽和度(S)、亮度(L)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏 色的,HSL即是代表色調(diào),飽和度,亮度三個通道的顏色,這個標準幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統(tǒng)之一。
- HSL色彩模式使用HSL模型為圖像中每一個像素的HSL分量分配一個0~255范圍內(nèi)的強度值。HSL圖像只使用三種通道,就可以使它們按照不同的比例混合,在屏幕上重現(xiàn)16777216種顏色。
- 在 HSL 模式下,每種 HSL 成分都可使用從 0到 255的值。(其中L是從黑(0)到白(255)漸變) 。
老照片效果的總體思路是,對色調(diào)、飽和度、亮度進行處理,而非之前的紅綠藍色調(diào)處理。
(2)算法實現(xiàn)
-
效果圖
HSL色彩模式
1、顏色HSL
H: hue 色調(diào) : saturation 飽和度 L: lum 亮度2、概述
- HSL色彩模式是工業(yè)界的一種顏色標準,是通過對色調(diào)(H)、飽和度(S)、亮度(L)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,HSL即是代表色調(diào),飽和度,亮度三個通道的顏色,這個標準幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統(tǒng)之一。
- HSL色彩模式使用HSL模型為圖像中每一個像素的HSL分量分配一個0~255范圍內(nèi)的強度值。HSL圖像只使用三種通道,就可以使它們按照不同的比例混合,在屏幕上重現(xiàn)16777216種顏色。
- 在 HSL 模式下,每種 HSL 成分都可使用從 0到 255的值。(其中L是從黑(0)到白(255)漸變) 。
3、HSL與RGB轉(zhuǎn)換
a. RGB→HSL的算法描述
步驟1:把RGB值轉(zhuǎn)成【0,1】中數(shù)值。?
步驟2:找出R,G和B中的最大值。?
步驟3:設(shè)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區(qū)域。RGB顏色空間是一個立方體而HSL顏色空間是兩個六角形 錐體,其中的L是RGB立方體的主對角線。因此,RGB立方體的頂點:紅、黃、綠、青、藍和品紅就成為HSL六角形的頂點,而數(shù)值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-LS?
步驟3:temp1=2.0-temp2?
步驟4:把H轉(zhuǎn)換到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.0temp3<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色彩模式轉(zhuǎn)換代碼實現(xiàn)
RGB色彩模式 HSL色彩模式HSL色彩模式與RGB色彩模式轉(zhuǎn)換算法
HSL與RGB轉(zhuǎn)換
-
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值轉(zhuǎn)成【0,1】中數(shù)值。?
步驟2:找出R,G和B中的最大值。?
步驟3:設(shè)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區(qū)域。RGB顏色空間是一個立方體而HSL顏色空間是兩個六角形錐體,其中的L是RGB立方體的主對角線。因此,RGB立方體的頂點:紅、黃、綠、青、藍和品紅就成為HSL六角形的頂點,而數(shù)值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-LS?
步驟3:temp1=2.0-temp2?
步驟4:把H轉(zhuǎn)換到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.0temp3<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、功能
- 拍攝相片
- 視頻錄制
- 取景器(掃描類應(yīng)用,如人臉識別,名片識別,條形碼識別)
2、根據(jù)Camera API實現(xiàn)自己的拍照程序,共7步
Camera Preview是什么?
攝像頭返回的RAW數(shù)據(jù)經(jīng)過isp處理后形成yuv數(shù)據(jù),android系統(tǒng)將該數(shù)據(jù)繪制到取景區(qū)上,不斷繪制幀數(shù)據(jù)形成實時預(yù)覽數(shù)據(jù)。
如何獲取Camera Preview中的數(shù)據(jù)?
- Camera.PreviewCallback
- setPreviewCallback?
屏幕上顯示一個新的預(yù)覽幀時調(diào)用onPreviewFrame方法(時時獲取) - setPreviewCallbackWithBuffer?
其與setPreviewCallback的工作方式相同,但要求指定一個字節(jié)數(shù)?
組作為緩沖區(qū),用于預(yù)覽圖像數(shù)據(jù)(addCallbackBuffer)
Android Camera 實時濾鏡怎么做?
YUV轉(zhuǎn)RGB的算法,轉(zhuǎn)換的公式一般如下,也是線性的關(guān)系:?
R = Y + 1.14V?
G = Y - 0.39U - 0.58V?
B = Y + 2.03U?
問題?
1、屏幕卡頓,用戶體驗低?
2、性能低,影響系統(tǒng)性能?
如何優(yōu)化??
- 提高流程度?
圖像渲染采用OpenGL ES SurfaceTexture?
- 提高性能?
GPU優(yōu)化?
總結(jié)
以上是生活随笔為你收集整理的Android系统将内置滤镜功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2015 深度学习文章整理
- 下一篇: 滤镜URL