zoukankan      html  css  js  c++  java
  • 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])

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

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

     

  • 相关阅读:
    Linux 系统下 “账户管理”
    gulp添加版本号解决缓存问题
    vue3.0的proxy浅析内层绑定原理
    rem用font-size布局与easyui的datagrid通用,出现table不显示
    堆与栈 | 对象深浅拷贝
    vue双向绑定原理值Object.defineProperty
    bootstrap模态框不出,只出现黑色蒙层bug
    Appdelegate 导航操作
    CLLocationManager 位置定位
    导航创建
  • 原文地址:https://www.cnblogs.com/luseike/p/4332073.html
Copyright © 2011-2022 走看看