CoreImage

CoreImage是一個(gè)圖片分析和處理技術(shù),提供了為靜態(tài)圖片和視頻接近實(shí)時(shí)處理的功能,它是iOS的圖像處理中非常重要的框架,要注意它與CoreGraphics等之間的區(qū)別,CoreGraphics是做繪圖的,CoreImage可以接受CoreGraphics繪制的圖片,經(jīng)過(guò)處理,比如濾鏡,然后輸出。
它能處理來(lái)自CoreGraphicsCoreVideo、Image I/O的框架的數(shù)據(jù)類型,通過(guò)GPU或者CPU進(jìn)行渲染。
使用CoreImage不需要知道OpenGL ES的具體細(xì)節(jié),也不需要知道GPU的工作細(xì)節(jié)

CoreImage的功能描述

來(lái)看一張Apple官方的圖:


Snip20161218_4.png

來(lái)看一下CoreImage的功能:

  • 提供了內(nèi)建的圖片處理濾鏡
  • 一些特征識(shí)別能力,比如識(shí)別矩形
  • 自動(dòng)改善圖像
  • 鏈接多個(gè)濾鏡達(dá)到自定義的效果,提供鏈?zhǔn)綖V鏡的效果,一個(gè)濾鏡的輸出可以是下一個(gè)濾鏡的輸入
  • 在GPU上創(chuàng)建自定義濾鏡的效果
  • 人臉識(shí)別的能力(只能識(shí)別是不是人臉,不具備用臉?biāo)⒖ǖ男Ч?/li>

CoreImage提供了上百種內(nèi)建的濾鏡,提供了用key-value的形式創(chuàng)建濾鏡,
并且一個(gè)濾鏡的輸出可以是下一個(gè)濾鏡的輸入,這使得我們可以創(chuàng)建各種各樣的效果。

CoreImage中用到的類主要有:CIImage、CIFilter、CIContext (上下文)、 CIDetector (檢測(cè))、CIFeature (特征)

  • Processing Image

Processing Image 就是使用濾鏡,濾鏡是一個(gè)圖片處理算法程序,能夠?qū)斎雸D片進(jìn)行一個(gè)像素點(diǎn)一個(gè)像素點(diǎn)進(jìn)行算法上的效果處理,然后生成輸出的圖片。Processing Image依靠的是<a name="fenced-code-block">CIFilter</a>和<a name="fenced-code-block">CIImage</a>這兩個(gè)類,分別對(duì)應(yīng)著濾鏡輸入輸出圖片
看一下濾鏡的基礎(chǔ)使用:

使用CIFilter的步驟:

  • 創(chuàng)建CIImage對(duì)象
  • 創(chuàng)建CIContext上下文,用作畫布
  • 創(chuàng)建CIFilter對(duì)象
  • 輸出濾鏡

不同的CIFilter會(huì)有不同的參數(shù),如果我們想知道具體的某個(gè)CIFilter有哪些參數(shù),可以調(diào)用它的inputKeys方法,或者調(diào)用*** outputKeys獲取它的輸出參數(shù)列表,我們一般使用它的參數(shù)outputImage,再或者調(diào)用** attributes***得到這個(gè)CIFilter對(duì)象的所有信息:它的名字、所屬的分類、輸入?yún)?shù)、輸出參數(shù)、各參數(shù)的取值范圍以及默認(rèn)值等。
幾乎所有的濾鏡都有inputImage這個(gè)輸入?yún)?shù),系統(tǒng)已經(jīng)為它預(yù)定義了kCIInputImageKey,如果沒(méi)有預(yù)定義的,使用字符串。

let filter = CIFilter(name: "CIGaussianBlur")
print("\(filter.inputKeys)")
// 打印結(jié)果:["inputImage", "inputRadius"]
print("\(filter.outputKeys)")
// 打印結(jié)果:   ["outputImage"]
print("\(filter. attributes)")
/* 打印結(jié)果:
  ["CIAttributeFilterCategories": <__NSArrayI 0x600000057af0>(
        CICategoryBlur,
        CICategoryStillImage,
        CICategoryVideo,
        CICategoryBuiltIn
  )
, "CIAttributeFilterDisplayName": Gaussian Blur, 
  "CIAttributeFilterAvailable_iOS": 6, 
  "inputImage": {
    CIAttributeClass = CIImage;
    CIAttributeDescription = "The image to use as an input image. For filters that also use a background image, this is the foreground image.";
    CIAttributeDisplayName = Image;
    CIAttributeType = CIAttributeTypeImage;
},
 "CIAttributeFilterAvailable_Mac": 10.4,
 "CIAttributeReferenceDocumentation": http://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIGaussianBlur, 
"CIAttributeFilterName": CIGaussianBlur, 
"inputRadius": {
    CIAttributeClass = NSNumber;
    CIAttributeDefault = 10;
    CIAttributeDescription = "The radius determines how many pixels are used to create the blur. The larger the radius, the blurrier the result.";
    CIAttributeDisplayName = Radius;
    CIAttributeIdentity = 0;
    CIAttributeMin = 0;
    CIAttributeSliderMax = 100;
    CIAttributeSliderMin = 0;
    CIAttributeType = CIAttributeTypeScalar;
}]
*/
CIFilter濾鏡的基礎(chǔ)使用

運(yùn)行結(jié)果:


原圖

運(yùn)行效果圖

上面這個(gè)例子中使用了濾鏡CISepiaTone,這個(gè)濾鏡能使畫面整體偏棕褐色,有點(diǎn)復(fù)古的效果。

  • 高斯模糊

 func GaussianBlur() {
        let path = NSBundle.mainBundle().pathForResource("test", ofType: "jpg")!

        let context = CIContext()
        guard let filter = CIFilter(name: "CIGaussianBlur") else {
            return
        }
        filter.setValue(5.0, forKey: "inputRadius")

        let image = CIImage(contentsOfURL: NSURL(fileURLWithPath: path))
        filter.setValue(image, forKey: kCIInputImageKey)
        let result = filter.outputImage!
        let cgImage = context.createCGImage(result, fromRect: result.extent)

        imageView.image = UIImage(CGImage: cgImage!)
    }

上面的使用了CoreImage內(nèi)置的高斯模糊濾鏡:** CIGaussianBlur,設(shè)置模模糊半徑inputRadius**為5.0。模糊半徑越大,最后生成的圖像越模糊。

高斯模糊之后的效果圖,模糊半徑為5.0

  • 自動(dòng)改善圖像

上面提到過(guò),CoreImage有自動(dòng)改善圖像的功能,根據(jù)一個(gè)CIImage對(duì)象,能夠得到一組改善圖像質(zhì)量的濾鏡,具體可以通過(guò)autoAdjustmentFiltersautoAdjustmentFiltersWithOptions來(lái)獲取這個(gè)濾鏡數(shù)組。
得到的濾鏡數(shù)組一般是下面這幾個(gè),大部分情況已經(jīng)夠用了:

  • CIRedEyeCorrection: 修復(fù)因相機(jī)的閃光燈導(dǎo)致的各種紅眼
  • CIFaceBalance: 調(diào)整膚色
  • CIVibrance: 在不影響膚色的情況下,改善圖像的飽和度
  • CIToneCureve: 改善圖像的對(duì)比度
  • CIHighlightShadowAdjust: 改善陰影細(xì)節(jié)
func autoAjustmentImage() {
        let inputImage = CIImage(image: originalImage)!
        var resultImage: CIImage?
        let filters = inputImage.autoAdjustmentFilters() as [CIFilter]

        for filter: CIFilter in filters {
            filter.setValue(inputImage, forKey: kCIInputImageKey)
            resultImage = filter.outputImage!
        }
        if let result = resultImage {
            imageView.image = UIImage(CIImage: result)
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容