濾鏡sdk適用的場景有很多,比較常見的有直播、短視頻、特效相機等,而隨着科技的不斷髮展,現代人對照片視頻的色彩和質感方面的要求也越來越高。本文以濾鏡算法爲主要內容來簡單分享下。
灰度濾鏡
常見的彩色圖片有RGB_8888、RGB_565、RGB_4444幾種,每一個像素的顏色值由紅、綠、藍三種值混合而成,紅綠藍的取值也有很多種,而像素的顏色值也有很多顏色值,這可以看作彩色圖片的原理。相反的,灰度圖片只有356中顏色,通常處理過程中是將圖片顏色值的RGB三個通道值設定一樣的,這樣一來原本是256x256x256種顏色就只剩下256種,而256中顏色值就相當於是丟失了圖片的彩色信息,只剩下了亮度值,從人類的視覺上看就是灰色。
在濾鏡sdk中,灰度處理通常有三種算法:
1.最大值——即新的顏色值R=G=B=Max(R,G,B),該方法處理後的圖片或視頻亮度較高。
2.平均值——即新的顏色值R=G=B=(R+G+B)/3,處理後的圖片較柔和。
3.加權平均值——即新的顏色值R=G=B=(RxWr+GxWg+BxWb),由於人眼對不同顏色的敏感度不同,所以三種顏色值的權重也就不同。通常是綠色最高、紅色第二、藍色最低。
for(var i = 0; i < data.length; i+=4) {
var grey = (data[i] + data[i+1] + data[i+2]) / 3;
data[i] = data[i+1] = data[i+2] = grey;
}
(本段代碼僅供參考,不作商用)
黑白濾鏡
其實黑白和灰度還是有一定區別的,灰度有256種顏色,而黑白是隻保留黑白兩種顏色。
可以計算RGB的平均值arg,arg>=100,R=G=B=255,否則均爲0
for(var i = 0; i < data.length; i += 4) {
var avg = (data[i] + data[i+1] + data[i+2]) / 3;
data[i] = data[i+1] = data[i+2] = avg >= 100 ? 255 : 0;
}
(本段代碼僅供參考,不作商用)
底片(反向)濾鏡
即將當前像素點的RGB值分別於255之差後的值作爲當前點的RGB值,則R=255-R;G=255-G;B=255-B。
for(var i = 0; i < data.length; i+= 4) {
data[i] = 255 - data[i];
data[i + 1] = 255 - data[i + 1];
data[i + 2] = 255 - data[i + 2];
}
(本段代碼僅供參考,不作商用)
浮雕濾鏡
相比前面幾種濾鏡算法,浮雕濾鏡的算法實現相對比較複雜,用當前點的RGB值減去相鄰點的RGB值並加上128作爲新的RGB 值。因爲圖片中相鄰點的顏色值是比較接近的,所以在做算法處理之後只有顏色的邊沿區域,即相鄰顏色差異較大的部分結果會稍微明顯一些,其他平滑區域值一般在128左右,從而實現浮雕效果。
int preColor = 0;
int prepreColor = 0;
preColor = cbuf[0];
int i = 0;
int j = 0;
for (i = 0; i < width; i++)
{
for (j = 0; j < height; j++)
{
int curr_color = cbuf[j * width + i];
int r = red(curr_color) - red(prepreColor) + 128;
int g = green(curr_color) - red(prepreColor) + 128;
int b = green(curr_color) - blue(prepreColor) + 128;
int a = alpha(curr_color);
int newcolor = (int)(r * 0.3 + g * 0.59 + b * 0.11);
int modif_color = ARGB(a, newcolor, newcolor, newcolor);
rbuf[j * width + i] = modif_color;
prepreColor = preColor;
preColor = curr_color;
}
}
(本段代碼僅供參考,不作商用)
褐色濾鏡
對顏色進行變換的濾鏡,在此就不多作贅述。採用公式:R=Rx0.393+Gx0.7 69+Bx0.189;G=Rx0.349+Gx0.686+Bx0.168;B=Rx0.272+Gx0.534+Bx0.131。
for (var i = 0; i < imgData.height * imgData.width; i++) {
var r = imgData.data[i * 4],
g = imgData.data[i * 4 + 1],
b = imgData.data[i * 4 + 2];
var newR = r * 0.393 + g * 0.769 + b * 0.189;
var newG = r * 0.349 + g * 0.686 + b * 0.168;
var newB = r * 0.272 + g * 0.534 + b * 0.131;
var rgbArr = [newR, newG, newB];
[imgData.data[i * 4], imgData.data[i * 4 + 1], imgData.data[i * 4 + 2]] = rgbArr;
}
(本段代碼僅供參考,不作商用)