封裝 Core Image 的 API - 延展方式

上一篇:Swift 無限輪播圖

Why

  • Core Image 是一個強大的圖像處理框架,但是它的 API 有時可能略顯笨拙
  • Core Image 的 API 是弱類型的 —— 我們通過鍵值編碼 (KVC) 來配置圖像濾鏡 (filter)
  • 在使用參數(shù)的類型或名字時,我們都使用字符串來進(jìn)行表示,這十分容易出錯,極有可能導(dǎo)致運行時錯誤

Method & Advantage

Method

對 CIImage 延展開發(fā)新的 API

Advantage

避免這些運行時錯誤一忱,最終得到一組類型安全的 API

Usage

效果圖
調(diào)用代碼
if let url = URL(string: "https://via.placeholder.com/300x180/62abe4/ffffff?text=Core+Image"), let image = CIImage(contentsOf: url) {
    
    // 原圖
    coreImageViews[0].image = UIImage(ciImage: image)
    
    // 高斯模糊濾鏡
    coreImageViews[1].image = UIImage(ciImage: image.blurred(radius: 2))
    
    // 顏色生成濾鏡
    let color = UIColor.orange.withAlphaComponent(0.4)
    coreImageViews[2].image = UIImage(ciImage: image.generated(color: color))
    
    // 圖像覆蓋合成濾鏡(自己實現(xiàn))
    coreImageViews[3].image = UIImage(ciImage: image.generated(color: color).compositeSource(over: image))
    
    // 圖像覆蓋合成濾鏡(系統(tǒng)自帶)
    coreImageViews[4].image = UIImage(ciImage: image.generated(color: color).composited(over: image))
    
    // 顏色疊層濾鏡
    let yellow = UIColor.yellow.withAlphaComponent(0.4)
    coreImageViews[5].image = UIImage(ciImage: image.overlaid(color: yellow))
}

Implementation

1、高斯模糊濾鏡(CIGaussianBlur)
// 1.高斯模糊濾鏡(CIGaussianBlur)
public func blurred(radius: Double) -> CIImage {
    let parameters: [String: Any] = [
        kCIInputRadiusKey: radius,
        kCIInputImageKey: self
    ]
    guard let filter = CIFilter(name: "CIGaussianBlur", parameters: parameters) else {
        fatalError("CIGaussianBlur filter creation failed!")
    }
    guard let outputImage = filter.outputImage else {
        fatalError("CIGaussianBlur outputImage generation failed!")
    }
    return outputImage
}
2、顏色生成濾鏡(CIConstantColorGenerator)
// 2.顏色生成濾鏡(CIConstantColorGenerator)
public func generated(color: UIColor) -> CIImage {
    let parameters: [String: Any] = [
        kCIInputColorKey: CIColor(cgColor: color.cgColor)
    ]
    guard let filter = CIFilter(name: "CIConstantColorGenerator", parameters: parameters) else {
        fatalError("CIConstantColorGenerator filter creation failed!")
    }
    guard let outputImage = filter.outputImage else {
        fatalError("CIConstantColorGenerator outputImage generation failed!")
    }
    return outputImage.cropped(to: extent)
}
3士飒、圖像覆蓋合成濾鏡(CISourceOverCompositing)
// 3.圖像覆蓋合成濾鏡(CISourceOverCompositing)
// iOS8.0開始 <func composited(over dest: CIImage) -> CIImage> 的實現(xiàn)原理
public func compositeSource(over dest: CIImage) -> CIImage {
    let parameters: [String: Any] = [
        kCIInputBackgroundImageKey: dest,
        kCIInputImageKey: self
    ]
    guard let filter = CIFilter(name: "CISourceOverCompositing", parameters: parameters) else {
        fatalError("CISourceOverCompositing filter creation failed!")
    }
    guard let outputImage = filter.outputImage else {
        fatalError("CISourceOverCompositing outputImage generation failed!")
    }
    return outputImage.cropped(to: extent)
}
4、顏色疊層濾鏡
// 4.顏色疊層濾鏡
public func overlaid(color: UIColor) -> CIImage {
    let overlay = generated(color: color)
    return overlay.compositeSource(over: self)
}

Contact

QQ: 2256472253
Email: ixialuo@126.com

Github

下載Demo

下一篇:封裝 Core Image 的 API - 高階函數(shù)方式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔗崎,一起剝皮案震驚了整個濱河市酵幕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缓苛,老刑警劉巖芳撒,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡笔刹,警方通過查閱死者的電腦和手機芥备,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舌菜,“玉大人萌壳,你說我怎么就攤上這事∪赵拢” “怎么了袱瓮?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長爱咬。 經(jīng)常有香客問我尺借,道長,這世上最難降的妖魔是什么台颠? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任褐望,我火速辦了婚禮,結(jié)果婚禮上串前,老公的妹妹穿的比我還像新娘瘫里。我一直安慰自己,他們只是感情好荡碾,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布谨读。 她就那樣靜靜地躺著,像睡著了一般坛吁。 火紅的嫁衣襯著肌膚如雪劳殖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天拨脉,我揣著相機與錄音哆姻,去河邊找鬼。 笑死玫膀,一個胖子當(dāng)著我的面吹牛矛缨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帖旨,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼箕昭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了解阅?” 一聲冷哼從身側(cè)響起落竹,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎货抄,沒想到半個月后述召,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朱转,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年桨武,在試婚紗的時候發(fā)現(xiàn)自己被綠了肋拔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡呀酸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琼梆,到底是詐尸還是另有隱情性誉,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布茎杂,位于F島的核電站错览,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏煌往。R本人自食惡果不足惜倾哺,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刽脖。 院中可真熱鬧羞海,春花似錦、人聲如沸曲管。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽院水。三九已至腊徙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間檬某,已是汗流浹背撬腾。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恢恼,地道東北人民傻。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像厅瞎,于是被迫代替她去往敵國和親饰潜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359