概述:git
CoreImage是一個圖像框架,它基於OpenGL頂層建立,底層則用着色器來處理圖像,這意味着它利用了GPU基於硬件加速來處理圖像。CoreImage中有不少濾鏡,它們可以一次給予一張圖像或者視頻幀多種視覺效果。並且濾鏡能夠鏈接起來組成一個濾鏡鏈,把濾鏡效果疊加起來處理圖像。github
CoreImage框架最先出現於iOS5,iOS6也對這個框架進行了擴展,這篇博客的Demo是基於iOS7的。app
CoreImage框架最經常使用的類:框架
* CIImage工具
保存圖像數據的類,能夠經過UIImage,圖像文件或者像素數據來建立,包括未處理的像素數據如:性能
- imageWithCVPixelBuffer:spa
- imageWithData:.net
方法等等。3d
也能夠經過圖像數據類好比UIImage,CGImageRef等等。orm
* CIFilter
濾鏡類,這個框架中對圖片屬性進行細節處理的類。它對全部的像素進行操做,用一些鍵-值設置來決定具體操做的程度。
* CIContext
上下文類,如CoreGraphics以及CoreData中的上下文用於處理繪製渲染以及處理託管對象同樣,CoreImage的上下文也是實現對圖像處理的具體對象。
這裏須要注意的是在Context建立的時候,咱們須要給它設定爲是基於GPU仍是CPU。(這裏使用GPU)
基於GPU的話,處理速度更快,由於利用了GPU硬件的並行優點。可是GPU受限於硬件紋理尺寸,並且若是你的程序在後臺繼續處理和保存圖片的話,那麼須要使用CPU,由於當app切換到後臺狀態時GPU處理會被打斷。
簡單使用:
簡介完三個類以後,介紹下簡單使用步驟:
實例化一個CIImage,
建立一個你須要的CIFilter濾鏡並給濾鏡設置屬性,
建立CIContext上下文來初始化一個CGImageRef對象,
再將其賦給UIImage對象進行顯示。
這篇文章採用工具類的方法來進行濾鏡處理。
下面是一個簡單的棕色濾鏡的使用:
傳入一個圖片的path,生成CIImage對象,而後經過SepiaTone濾鏡通過處理,強度自定義便可(範圍:0~1之間)。
UIImage不是有個類方法直接經過CIImage對象生成UIImage嗎?可是那樣每一次都要建立一個CIContext對象,對於頻繁調用時會很消耗性能。
因此,這裏的context在工具類初始化的時候已經初始化了。
這裏使用GPU來進行圖片渲染的處理。上面已經提到過,這樣速度會更快些。
若是想用CPU,則能夠調用[CIContext contextWithOptions:]傳入一個字典,將CPU做爲渲染鍵值。
工具類裏提供了4個方法可以快速的使用該濾鏡渲染。
下面繼續介紹其餘的濾鏡
仿射變換濾鏡
仍是經過兩種傳入途徑,一個路徑,一個圖片
如今咱們已經使用了兩個濾鏡。那麼可不能夠把兩個濾鏡連起來用呢?
答案是能夠的,這就是通常所說的濾鏡鏈,咱們能夠得到上一個濾鏡的輸出圖片做爲下一個濾鏡的輸入,而後進行渲染處理,而處理的次數怎麼處理則咱們由咱們本身需求而隨意更改。
因而我把上面兩個濾鏡鏈接起來使用。
CIImage *ciimg = [_tool transOutputWithPath:path transform:CGAffineTransformMakeRotation(M_PI)];
_image = [_tool sepiaImageWithCIImage:ciimg intensity:1.0];
_imageView.image = _image;
通過兩個工具方法處理後,咱們獲得了通過濾鏡鏈處理的圖像,以下:
混合濾鏡
若是你的圖片的透明通道爲YES想在下方添加一個底層的圖片的話,能夠用CISourceAtopCompositing濾鏡。
拉直濾鏡
若是你的圖片因爲拍攝時稍微傾斜或者抖動,可使用這個濾鏡並傳入一個旋轉角度參數來修正圖片。
色彩控制濾鏡
能夠傳入顏色的亮度,對比度和飽和度來給圖片過濾。
反轉顏色濾鏡
給圖片使用反色。
面部檢測初步
CoreImage類中提供了一個CIDectetor類來給咱們提供兩種類型的檢測器。
其中一種便是面部檢測。
建立檢測器時傳入Type參數指定爲面部便可,options中能夠傳入一個檢測精度。
下面是返回圖片中全部左眼位置、右眼位置以及嘴部位置的方法。
左眼:
右眼:
嘴部:
這篇博客介紹了CoreImage出現以來最基本的幾個濾鏡。
以後會對這個濾鏡處理工具繼續進行擴充。
Demo下載
CSDN資源:點擊打開連接
GitHub倉庫:點擊打開連接
以上就是本篇博客的所有內容,歡迎指正和交流~轉載註明出處~