博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Core Image 制作自己的美图秀秀
阅读量:5047 次
发布时间:2019-06-12

本文共 6684 字,大约阅读时间需要 22 分钟。

一、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])

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

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

 

转载于:https://www.cnblogs.com/luseike/p/4332073.html

你可能感兴趣的文章
Linux - 设置SFTP服务用户目录权限
查看>>
Ctrl+Tab
查看>>
JAVA设计模式之【工厂方法模式】
查看>>
[No000034]知乎-长期接收碎片化知识有什么弊端?
查看>>
SVG_资料_坐标转换
查看>>
Windows单机配置Zookeeper环境
查看>>
[CentOS]yum安装postgres和ntfs-3g
查看>>
PHP ob_clean 清空先前输出
查看>>
(翻译)React Container Components
查看>>
Notification的总结
查看>>
pku 2299 Ultra-QuickSort 归并排序求逆序数
查看>>
Python 进度条
查看>>
在chorme中查找多余的css规则
查看>>
搜索引擎选择: Elasticsearch与Solr
查看>>
串口开发
查看>>
RxSwift学习笔记6:Subjects/PublishSubject/BehaviorSubject/ReplaySubject/Variable
查看>>
nohup
查看>>
JAVA设计模式之策略模式 - Strategy
查看>>
Android 自定义View并添加属性
查看>>
Xamarin Android教程Android基本知识版本介绍与系统介绍
查看>>