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

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

來(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;
}]
*/

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


上面這個(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。模糊半徑越大,最后生成的圖像越模糊。

-
自動(dòng)改善圖像
上面提到過(guò),CoreImage有自動(dòng)改善圖像的功能,根據(jù)一個(gè)CIImage對(duì)象,能夠得到一組改善圖像質(zhì)量的濾鏡,具體可以通過(guò)autoAdjustmentFilters 或 autoAdjustmentFiltersWithOptions來(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)
}
}