2.IOS(swift)-扣圖濾鏡

我們可以刪除一幅圖像中指定的顏色膛腐,然后填充一個背景。類似好萊塢大片的背景合成。


Paste_Image.png

要實(shí)現(xiàn)上面圖片的效果有下面幾個步驟

  • 首先我們要從圖像中刪除我們要刪掉的顏色或听,通過創(chuàng)建一個顏色矩陣,將要刪除的顏色變換成透明色笋婿。
  • 用CICOlorCube 濾鏡刪除圖像中通過矩陣變換過的顏色誉裆。
  • 最后用 CISourceOverCompositing 合成圖片。

創(chuàng)建一個 color Cube Map
一個color cube是一個3D顏色查找表(lookup table)缸濒。Core Image 濾鏡 CIColorCube 使用色值作為輸入足丢,并應(yīng)用一個查找表到這些色值。CIColorCube
從圖像中刪除所有的綠色庇配。就是要把圖中的把綠色的alpha
值設(shè)置為0.0(透明)斩跌。
“綠色”包括一定范圍內(nèi)的顏色。最直接的處理方式是把圖像的色值從RGBA轉(zhuǎn)為HSV讨永。HSV把顏色描述在圓柱坐標(biāo)系內(nèi)的點(diǎn)滔驶。

Paste_Image.png

要刪除綠色,你需要定義圍繞中心點(diǎn)的最小和最大的角度卿闹。之后,對于任何的綠色萝快,將其alpha值設(shè)置為0.0锻霎。純綠的相對角度是120o。最小值和最大值要以這個值為中心揪漩。

我們要消除的“深綠色”并不只是視覺上的一種顏色旋恼,而是顏色的范圍,最直接的方法是將RGBA轉(zhuǎn)成HSV(Hue奄容,Saturation冰更,Value),在HSV的格式下昂勒,顏色是圍繞圓柱體中軸的角度來表現(xiàn)的蜀细,在這種表現(xiàn)方法下,你能把顏色的范圍想象成連在一起的扇形戈盈,然后直接把該塊區(qū)域干掉(alpha設(shè)為0)奠衔,這就表示我們實(shí)際上需要指定顏色區(qū)域的范圍------圍繞圓柱體中軸線的最小角度以及最大角度,此范圍內(nèi)的顏色alpha設(shè)為0塘娶。最后归斤,Cube Map表中的數(shù)據(jù)必須乘以alpha,所以創(chuàng)建Cube Map的最后一步是把RGB值乘以你剛剛計(jì)算出來的alpha值:如果是想要消除的顏色刁岸,乘出來就是0脏里,反之則不變

Hue

可以看到如果是純綠色,其取值是120度虹曙,藍(lán)色是240度迫横,在這個網(wǎng)站上可以看到更詳細(xì)的RGB顏色對應(yīng)的HSV值鸦难。

Paste_Image.png

Cube map數(shù)據(jù)必須預(yù)乘alpha,所以創(chuàng)建cube map的最后一步是把RGB值乘以你剛剛計(jì)算出的alpha值(如果是綠色员淫,就是0合蔽,如果不是就是1.0) 下面是例子代碼。

struct CubeMap createCubeMap(float minHueAngle, float maxHueAngle) {
    const unsigned int size = 64;
    struct CubeMap map;
    map.length = size * size * size * sizeof (float) * 4;
    map.dimension = size;
    float *cubeData = (float *)malloc (map.length);
    float rgb[3], hsv[3], *c = cubeData;
    
    for (int z = 0; z < size; z++){
        rgb[2] = ((double)z)/(size-1); // Blue value
        for (int y = 0; y < size; y++){
            rgb[1] = ((double)y)/(size-1); // Green value
            for (int x = 0; x < size; x ++){
                rgb[0] = ((double)x)/(size-1); // Red value
                rgbToHSV(rgb,hsv);
                
                // Use the hue value to determine which to make transparent
                // The minimum and maximum hue angle depends on
                // the color you want to remove
                float alpha = (hsv[0] > minHueAngle && hsv[0] < maxHueAngle) ? 0.0f: 1.0f;
                // Calculate premultiplied alpha values for the cube
                c[0] = rgb[0] * alpha;
                c[1] = rgb[1] * alpha;
                c[2] = rgb[2] * alpha;
                c[3] = alpha;
                c += 4; // advance our pointer into memory for the next color value
            }
        }
    }
    map.data = cubeData;
    return map;
}

我們一般得到的UIColor時一個RGB顏色介返,需要轉(zhuǎn)為HSV拴事,Apple提供了getHue方法,這樣我們就能通過var hsvCol = RGBtoHSV(R, g: G, b: B)獲得HSV圣蝎,在通過hsvCol.h獲取得到Hue并乘以360度獲取改顏色所在的度數(shù)刃宵。

    func RGBtoHSV(r : CGFloat, g : CGFloat, b : CGFloat) -> (h : CGFloat, s : CGFloat, v : CGFloat) {
        var h : CGFloat = 0.0
        var s : CGFloat = 0.0
        var v : CGFloat = 0.0
        let col = UIColor(red: r, green: g, blue: b, alpha: 1.0)
        col.getHue(&h, saturation: &s, brightness: &v, alpha: nil)
        return (h, s, v)
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市徘公,隨后出現(xiàn)的幾起案子牲证,更是在濱河造成了極大的恐慌,老刑警劉巖关面,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坦袍,死亡現(xiàn)場離奇詭異,居然都是意外死亡等太,警方通過查閱死者的電腦和手機(jī)捂齐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缩抡,“玉大人奠宜,你說我怎么就攤上這事≌跋耄” “怎么了压真?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蘑险。 經(jīng)常有香客問我滴肿,道長,這世上最難降的妖魔是什么漠其? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任嘴高,我火速辦了婚禮,結(jié)果婚禮上和屎,老公的妹妹穿的比我還像新娘拴驮。我一直安慰自己,他們只是感情好柴信,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布套啤。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪潜沦。 梳的紋絲不亂的頭發(fā)上萄涯,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機(jī)與錄音唆鸡,去河邊找鬼涝影。 笑死,一個胖子當(dāng)著我的面吹牛争占,可吹牛的內(nèi)容都是我干的燃逻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼臂痕,長吁一口氣:“原來是場噩夢啊……” “哼伯襟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起握童,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤姆怪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后澡绩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稽揭,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年英古,在試婚紗的時候發(fā)現(xiàn)自己被綠了淀衣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡召调,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛮浑,到底是詐尸還是另有隱情唠叛,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布沮稚,位于F島的核電站艺沼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蕴掏。R本人自食惡果不足惜障般,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盛杰。 院中可真熱鬧挽荡,春花似錦、人聲如沸即供。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逗嫡。三九已至青自,卻和暖如春株依,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背延窜。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工恋腕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逆瑞。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓荠藤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呆万。 傳聞我的和親對象是個殘疾皇子商源,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容