Core Image 制作自己的美图秀秀

一、Core Image是和啥?

关于这个问题不太好回答,但其实又也很简单。肯定是苹果推出的关于图片处理的API。网上各路大神都有解释过,不过能看明白的不多,我的理解就是Photoshop的滤镜,当然在各种美图软件里都有这个功能,咱主要看怎么用吧

二、Core Image提供了哪些可用的滤镜呢?

127 values
 {
  [0] = "CIAccordionFoldTransition"
  [1] = "CIAdditionCompositing"
  [2] = "CIAffineClamp"
  [3] = "CIAffineTile"
  [4] = "CIAffineTransform"
  [5] = "CIAreaHistogram"
  [6] = "CIAztecCodeGenerator"
  [7] = "CIBarsSwipeTransition"
  [8] = "CIBlendWithAlphaMask"
  [9] = "CIBlendWithMask"
  [10] = "CIBloom"
  [11] = "CIBumpDistortion"
  [12] = "CIBumpDistortionLinear"
  [13] = "CICheckerboardGenerator"
  [14] = "CICircleSplashDistortion"
  [15] = "CICircularScreen"
  [16] = "CICode128BarcodeGenerator"
  [17] = "CIColorBlendMode"
  [18] = "CIColorBurnBlendMode"
  [19] = "CIColorClamp"
  [20] = "CIColorControls"
  [21] = "CIColorCrossPolynomial"
  [22] = "CIColorCube"
  [23] = "CIColorCubeWithColorSpace"
  [24] = "CIColorDodgeBlendMode"
  [25] = "CIColorInvert"
  [26] = "CIColorMap"
  [27] = "CIColorMatrix"
  [28] = "CIColorMonochrome"
  [29] = "CIColorPolynomial"
  [30] = "CIColorPosterize"
  [31] = "CIConstantColorGenerator"
  [32] = "CIConvolution3X3"
  [33] = "CIConvolution5X5"
  [34] = "CIConvolution9Horizontal"
  [35] = "CIConvolution9Vertical"
  [36] = "CICopyMachineTransition"
  [37] = "CICrop"
  [38] = "CIDarkenBlendMode"
  [39] = "CIDifferenceBlendMode"
  [40] = "CIDisintegrateWithMaskTransition"
  [41] = "CIDissolveTransition"
  [42] = "CIDivideBlendMode"
  [43] = "CIDotScreen"
  [44] = "CIEightfoldReflectedTile"
  [45] = "CIExclusionBlendMode"
  [46] = "CIExposureAdjust"
  [47] = "CIFalseColor"
  [48] = "CIFlashTransition"
  [49] = "CIFourfoldReflectedTile"
  [50] = "CIFourfoldRotatedTile"
  [51] = "CIFourfoldTranslatedTile"
  [52] = "CIGammaAdjust"
  [53] = "CIGaussianBlur"
  [54] = "CIGaussianGradient"
  [55] = "CIGlassDistortion"
  [56] = "CIGlideReflectedTile"
  [57] = "CIGloom"
  [58] = "CIHardLightBlendMode"
  [59] = "CIHatchedScreen"
  [60] = "CIHighlightShadowAdjust"
  [61] = "CIHistogramDisplayFilter"
  [62] = "CIHoleDistortion"
  [63] = "CIHueAdjust"
  [64] = "CIHueBlendMode"
  [65] = "CILanczosScaleTransform"
  [66] = "CILightenBlendMode"
  [67] = "CILightTunnel"
  [68] = "CILinearBurnBlendMode"
  [69] = "CILinearDodgeBlendMode"
  [70] = "CILinearGradient"
  [71] = "CILinearToSRGBToneCurve"
  [72] = "CILineScreen"
  [73] = "CILuminosityBlendMode"
  [74] = "CIMaskToAlpha"
  [75] = "CIMaximumComponent"
  [76] = "CIMaximumCompositing"
  [77] = "CIMinimumComponent"
  [78] = "CIMinimumCompositing"
  [79] = "CIModTransition"
  [80] = "CIMultiplyBlendMode"
  [81] = "CIMultiplyCompositing"
  [82] = "CIOverlayBlendMode"
  [83] = "CIPerspectiveCorrection"
  [84] = "CIPhotoEffectChrome"
  [85] = "CIPhotoEffectFade"
  [86] = "CIPhotoEffectInstant"
  [87] = "CIPhotoEffectMono"
  [88] = "CIPhotoEffectNoir"
  [89] = "CIPhotoEffectProcess"
  [90] = "CIPhotoEffectTonal"
  [91] = "CIPhotoEffectTransfer"
  [92] = "CIPinchDistortion"
  [93] = "CIPinLightBlendMode"
  [94] = "CIPixellate"
  [95] = "CIQRCodeGenerator"
  [96] = "CIRadialGradient"
  [97] = "CIRandomGenerator"
  [98] = "CISaturationBlendMode"
  [99] = "CIScreenBlendMode"
  [100] = "CISepiaTone"
  [101] = "CISharpenLuminance"
  [102] = "CISixfoldReflectedTile"
  [103] = "CISixfoldRotatedTile"
  [104] = "CISmoothLinearGradient"
  [105] = "CISoftLightBlendMode"
  [106] = "CISourceAtopCompositing"
  [107] = "CISourceInCompositing"
  [108] = "CISourceOutCompositing"
  [109] = "CISourceOverCompositing"
  [110] = "CISRGBToneCurveToLinear"
  [111] = "CIStarShineGenerator"
  [112] = "CIStraightenFilter"
  [113] = "CIStripesGenerator"
  [114] = "CISubtractBlendMode"
  [115] = "CISwipeTransition"
  [116] = "CITemperatureAndTint"
  [117] = "CIToneCurve"
  [118] = "CITriangleKaleidoscope"
  [119] = "CITwelvefoldReflectedTile"
  [120] = "CITwirlDistortion"
  [121] = "CIUnsharpMask"
  [122] = "CIVibrance"
  [123] = "CIVignette"
  [124] = "CIVignetteEffect"
  [125] = "CIVortexDistortion"
  [126] = "CIWhitePointAdjust"
}
View Code

目前来说提供了127个,我给你查出来了,你自己看着用吧,向Core Image的kCICategoryBuiltIn类别请求得到滤镜的名字

let filterNames = CIFilter.filterNamesInCategory(kCICategoryBuiltIn) as [String]

三、滤镜的基本使用

3.1 创建一个滤镜(使用滤镜名称,传给滤镜的初始化方法CIFilter就创建成功了)

let blurFilter=CIFilter(named:"CIGaussianBlur")

3.2 设置滤镜参数

滤镜的参数(比如上面创建了一个模糊滤镜)一般都是通过KVC的方式设置的,如下代码设置了模糊滤镜的模糊半径参数

blurFilter.setValue(12.0 forKey:"inputRadius")

3.3 创建使用滤镜的图像

Core Image要求使用滤镜的图像是CIImage类型,跟我们常用的UIImage不同,不过也很容易从UIImage创建,只需一行代码就能搞定

let inputImage=CIImage(image: sourceImageView.image)

3.4 将滤镜应用到图像上(其实是设置滤镜的一个很重要的属性:inputImage)

 blurFilter.setValue(inputImage, forKey: "inputImage")

3.5 得到一个滤镜处理后的图片

处理后的图片是在当前的滤镜渲染上下文中,故而必须先得到当前的上下文,咱一切从简

let ciContext=CIContext(options: nil)

从当前的上下文中得到输出的图片,当然这也是一个CIImage类型的图啦,传入的参数就是滤镜的属性:outputImage

let cgImage = ciContext.createCGImage(blurFilter.outputImage, fromRect: inputImage.extent())

 

从这个CIImage也是一句代码得到我们熟悉的UIImage

resultImageView.image=UIImage(CGImage: cgImage)

得到的结果直接上图片

很明显的模糊效果出来啦……鼓掌吧别愣着了

————————————————————————————————————————————————————————————————————————

一个图片绝不仅仅只能施加一种滤镜效果,我们可以创建多个滤镜组成一条滤镜渲染的链条,只不过要注意每个滤镜的inputImage属性都是上一个滤镜的输出属性:inputImage,在上面给小猫咪模糊的基础上,我来改造下,让原图不仅高斯模糊,在添加一个单色滤镜,在添加一个晕影滤镜

//创建输入图像
        let inputImage=CIImage(image: sourceImageView.image)
        //构建一个滤镜图表
        let sepiaColor=CIColor(red: 0.6, green: 0.65, blue: 0.54)
        let monochromeFilter=CIFilter(name: "CIColorMonochrome", withInputParameters:["inputColor":sepiaColor,"inputIntensity":1.0])
        monochromeFilter.setValue(inputImage, forKey: "inputImage")
        
        
        let blurFilter=CIFilter(name: "CIGaussianBlur")
        blurFilter.setValue(3.0, forKey: "inputRadius")
        blurFilter.setValue(monochromeFilter.outputImage, forKey: "inputImage")
    
        let vignetterFilter=CIFilter(name: "CIVignette", withInputParameters:["inputRadius":1.75,"inputIntensity":1.0])
        vignetterFilter.setValue(blurFilter.outputImage, forKey: "inputImage")
        
        let outputImage=vignetterFilter.outputImage
        
        //得到一个滤镜处理后的图片
        let ciContext=CIContext(options: nil)
        let cgImage=ciContext.createCGImage(outputImage, fromRect: inputImage.extent())
        resultImageView.image=UIImage(CGImage: cgImage)
View Code

可以看到第一个单色滤镜monochromeFilter的inputImage就是原图像:monochromeFilter.setValue(inputImage, forKey: "inputImage")

第二个高斯模糊的滤镜blurFilter的inputImage是前一个滤镜的输出outputImage:blurFilter.setValue(monochromeFilter.outputImage, forKey: "inputImage")

第三个晕影的滤镜vignetterFilter的inputImage是前一个滤镜的输出outputImage:vignetterFilter.setValue(blurFilter.outputImage, forKey: "inputImage")

同时也看到滤镜的属性可以在创建的时候就设置上去

let vignetterFilter=CIFilter(name: "CIVignette", withInputParameters:["inputRadius":1.75,"inputIntensity":1.0])

最后附上三个滤镜的叠加效果,具体效果可根据参数的不同任意变幻

去制作你自己的美图秀秀吧……

 

posted @ 2015-03-12 12:56  luseike  阅读(708)  评论(0编辑  收藏  举报