iOS面向函數(shù)編程的方式實(shí)現(xiàn)高斯模糊效果

本文僅代表個(gè)人學(xué)習(xí)研究成果扮宠,如有不對(duì)的地方蚯妇,請(qǐng)?jiān)谠u(píng)論下方探討对人!

  1. 將Filter類(lèi)型定義為一個(gè)函數(shù),該函數(shù)接受一個(gè)圖像作為參數(shù)并返回一個(gè)新的圖像

typealias Filter = (CIImage) -> CIImage

構(gòu)建濾鏡

現(xiàn)在我們已經(jīng)定義了 Filter 類(lèi)型凛俱,接著就可以開(kāi)始定義函數(shù)來(lái)構(gòu)建特定的的濾鏡了紊馏。這些函數(shù) 在接受特定濾鏡所需要的參數(shù)之后,構(gòu)造并返回一個(gè) Filter 類(lèi)型的值蒲犬。它們的基本形態(tài)大概都 是下面這樣:

func myFilter (...) -> Filter

注意這里的返回值 Filter瘦棋,也是一個(gè)函數(shù)。稍后我們將會(huì)借助它來(lái)組合多個(gè)濾鏡以實(shí)現(xiàn)期待的 圖像效果暖哨。

模糊

定義第一個(gè)簡(jiǎn)單的濾鏡 —— 高斯模糊濾鏡赌朋。定義它只需要模糊半徑這一個(gè)參數(shù):

func blur(radius: Double) -> Filter {
return { image in
let parameters: [String: Any] = [
kCIInputRadiusKey: radius,
kCIInputImageKey: image
]
guard let filter = CIFilter (name: "CIGaussianBlur",
withInputParameters: parameters)
else { fatalError () }
guard let outputImage = filter.outputImage
else { fatalError () } return outputImage
}
}

blur 函數(shù)返回一個(gè)新函數(shù),新函數(shù)接受一個(gè) CIImage 類(lèi)型的參數(shù) image篇裁, 并返回一個(gè)新圖像 (return lter .outputImage)沛慢。因此,blur 函數(shù)的返回值滿足我們之前定義 的 (CIImage) -> CIImage达布,也就是 Filter 類(lèi)型团甲。

顏色疊層

現(xiàn)在讓我們來(lái)定義一個(gè)能夠在圖像上覆蓋純色疊層的濾鏡。Core Image 默認(rèn)不包含這樣一個(gè)濾 鏡黍聂,但是我們完全可以用已經(jīng)存在的濾鏡來(lái)組成它躺苦。

我們將使用的兩個(gè)基礎(chǔ)組件:顏色生成濾鏡 (CIConstantColorGenerator) 和圖像覆蓋合成濾鏡 (CISourceOverCompositing)。首先讓我們來(lái)定義一個(gè)生成固定顏色的濾鏡:

funcgenerate(color:UIColor)-> Filter {
return { _ in
let parameters = [kCIInputColorKey: CIColor(cgColor: color.cgColor)]
guard let filter = CIFilter (name: "CIConstantColorGenerator",
withInputParameters: parameters)
else { fatalError () }
guard let outputImage = filter.outputImage
else { fatalError () } return outputImage
}
}

這段代碼看起來(lái)和我們用來(lái)定義模糊濾鏡的代碼非常相似产还,但是有一個(gè)顯著的區(qū)別:顏色生成 濾鏡不檢查輸入圖像匹厘。因此,我們不需要給返回函數(shù)中的圖像參數(shù)命名脐区。取而代之愈诚,我們使用 一個(gè)匿名參數(shù) _ 來(lái)強(qiáng)調(diào)濾鏡的輸入圖像參數(shù)是被忽略的。

接下來(lái),我們將要定義合成濾鏡:
func compositeSourceOver(overlay: CIImage) -> Filter {
return { image in
let parameters = [ kCIInputBackgroundImageKey: image,
kCIInputImageKey: overlay
]
guard let filter = CIFilter (name: "CISourceOverCompositing",
withInputParameters: parameters)
else { fatalError () }
guard let outputImage = filter.outputImage
else { fatalError () }
return outputImage.cropped(to: image.extent)
}

在這里我們將輸出圖像剪裁為與輸入圖像一致的尺寸炕柔。嚴(yán)格來(lái)說(shuō)酌泰,這不是必須的,完全取決于
我們希望濾鏡如何工作匕累。不過(guò)陵刹,這個(gè)選擇在我們即將涉及的例子中效果很好。
最后欢嘿,我們通過(guò)結(jié)合兩個(gè)濾鏡來(lái)創(chuàng)建顏色疊層濾鏡:
func overlay(color: UIColor) -> Filter {
return { image in
let overlay = generate(color: color)(image).cropped(to: image.extent)
return compositeSourceOver(overlay: overlay)(image)
}
}

我們?cè)俅畏祷亓艘粋€(gè)接受圖像作為參數(shù)的函數(shù)衰琐。我們?cè)诙x該函數(shù)的整個(gè)過(guò)程中所做的一切可 大致概括為:首先使用先前定義的顏色生成濾鏡函數(shù) generate(color:) 來(lái)生成一個(gè)新疊層。然 后以顏色作為參數(shù)調(diào)用該函數(shù)际插,返回 Filter 類(lèi)型值。而 Filter 類(lèi)型本身就是一個(gè)從 CIImage 到 CIImage 的函數(shù)显设,因此我們還可以向 generate(color:) 函數(shù)傳遞一個(gè) image 參數(shù)框弛,最終通過(guò)計(jì) 算能夠得到一個(gè) CIImage 類(lèi)型的新疊層。
與疊層的創(chuàng)建相似捕捂,所構(gòu)建的濾鏡函數(shù)的返回值也有著相同的結(jié)構(gòu):先通過(guò)調(diào)用 compositeSourceOver(overlay:) 來(lái)創(chuàng)建一個(gè)濾鏡瑟枫。然后以輸入圖像為參數(shù)調(diào)用這個(gè)濾鏡。

復(fù)合函數(shù)組合濾鏡

ffunc compose( filter filter1: @escaping Filter, with filter2 : @escaping Filter) -> Filter
{ `` return { image in filter2 ( filter1 (image)) }
}

使用

image.png

demo

以上知識(shí)源于王巍大神的分享指攒,后期會(huì)持續(xù)更新慷妙,致敬王巍大神!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末允悦,一起剝皮案震驚了整個(gè)濱河市膝擂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隙弛,老刑警劉巖架馋,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異全闷,居然都是意外死亡叉寂,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)总珠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)屏鳍,“玉大人,你說(shuō)我怎么就攤上這事局服〉霾t!?“怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵淫奔,是天一觀的道長(zhǎng)降淮。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么佳鳖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任霍殴,我火速辦了婚禮,結(jié)果婚禮上系吩,老公的妹妹穿的比我還像新娘来庭。我一直安慰自己,他們只是感情好穿挨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布月弛。 她就那樣靜靜地躺著,像睡著了一般科盛。 火紅的嫁衣襯著肌膚如雪帽衙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天贞绵,我揣著相機(jī)與錄音厉萝,去河邊找鬼。 笑死榨崩,一個(gè)胖子當(dāng)著我的面吹牛谴垫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播母蛛,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼翩剪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了彩郊?” 一聲冷哼從身側(cè)響起前弯,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秫逝,沒(méi)想到半個(gè)月后博杖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筷登,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年剃根,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片前方。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狈醉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惠险,到底是詐尸還是另有隱情苗傅,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布班巩,位于F島的核電站渣慕,受9級(jí)特大地震影響嘶炭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逊桦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一眨猎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧强经,春花似錦睡陪、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至炬称,卻和暖如春汁果,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背玲躯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工据德, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人府蔗。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓晋控,卻偏偏與公主長(zhǎng)得像汞窗,于是被迫代替她去往敵國(guó)和親姓赤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • --繪圖與濾鏡全面解析 概述 在iOS中可以很容易的開(kāi)發(fā)出絢麗的界面效果仲吏,一方面得益于成功系統(tǒng)的設(shè)計(jì)不铆,另一方面得益...
    韓七夏閱讀 2,721評(píng)論 2 10
  • 許多UIView的子類(lèi),如一個(gè)UIButton或一個(gè)UILabel裹唆,它們知道怎么繪制自己誓斥。遲早,你也將想要做一些自...
    shenzhenboy閱讀 1,636評(píng)論 2 8
  • 前言 最近在研究 Core Image 自定義 Filter 相關(guān)內(nèi)容许帐,重新學(xué)習(xí)了 Core Image劳坑,對(duì) Co...
    泥孩兒0107閱讀 762評(píng)論 0 4
  • { ??、引導(dǎo)界面 sleep(1.5); self.window = [[UIWindow alloc] init...
    CYC666閱讀 336評(píng)論 0 1
  • 壹 這幾天成畦,陽(yáng)光明媚距芬,空氣清新,開(kāi)學(xué)正當(dāng)時(shí)把省框仔! 前些天,我在空間拄养、朋友圈看到很多同學(xué)陸陸續(xù)續(xù)更新了狀態(tài)离斩,大致是:...
    秋之燕閱讀 258評(píng)論 0 0