美颜滤镜效果

GPUImage的介绍

  • GPUImage 是一个开源的基于GPU的图片或视频的处理框架,其本身内置了多达120多种常见的滤镜效果
  • GPUImage是利用GPU,使在图片和视频上应用不同的效果和滤镜变得非常的容易,同时它还拥有出色的性能,并且它的性能要比苹果内置的相关APIs出色

高斯模糊(毛玻璃)效果

  • 在iOS总实现毛玻璃效果方式有很多

    • UIToolBar本身有毛玻璃效果
    • iOS8之后UIVisualEffectView直接创建毛玻璃View
    • 系统CoreImage框架中直接修改图片
    • GPUImage框架给图片添加一层滤镜
  • 实现思路
    • 获取要修改成毛玻璃的图片
    • 给图片添加滤镜
    • 生成新的图片
  • 实现代码
  •  fileprivate func generateBlurImage(_ sourceImage : UIImage) -> UIImage {// 1.创建用于处理单张图片(类似于美图秀秀中打开相册中的图片进行处理)let processView = GPUImagePicture(image: sourceImage)// 2.创建滤镜let blurFilter = GPUImageGaussianBlurFilter()// 纹理大小blurFilter.texelSpacingMultiplier = 2.0blurFilter.blurRadiusInPixels = 5.0processView?.addTarget(blurFilter)// 3.处理图像blurFilter.useNextFrameForImageCapture()processView?.processImage()// 4.获取最新的图像return blurFilter.imageFromCurrentFramebuffer()}
    

其他滤镜效果

为多个target添加依赖库

  • 单个target
  • platform :ios, '8.0'
    use_frameworks!
    target 'targetName' dopod 'GPUImage'
    end
  • 多个target依赖相同的库(Ruby语法)
  • platform :ios, '9.0'
    use_frameworks!targetsArray = ['01-GPUImage毛玻璃', '02-GPUImage其他滤镜']targetsArray.each do |t|target t dopod 'GPUImage'end
    end
  • 不同target依赖不同的库
  • platform :ios, '8.0'
    use_frameworks!
    target 'targetName1' dopod 'Alamofire'
    endtarget 'targetName2' dopod 'Alamofire'pod 'Kingfisher'
    end

#

  • 常见滤镜
  • #pragma mark - 调整颜色 Handle Color#import "GPUImageBrightnessFilter.h"                //亮度#import "GPUImageExposureFilter.h"                  //曝光#import "GPUImageContrastFilter.h"                  //对比度#import "GPUImageSaturationFilter.h"                //饱和度#import "GPUImageGammaFilter.h"                     //伽马线#import "GPUImageColorInvertFilter.h"               //反色#import "GPUImageSepiaFilter.h"                     //褐色(怀旧)#import "GPUImageLevelsFilter.h"                    //色阶#import "GPUImageGrayscaleFilter.h"                 //灰度#import "GPUImageHistogramFilter.h"                 //色彩直方图,显示在图片上#import "GPUImageHistogramGenerator.h"              //色彩直方图#import "GPUImageRGBFilter.h"                       //RGB#import "GPUImageToneCurveFilter.h"                 //色调曲线#import "GPUImageMonochromeFilter.h"                //单色#import "GPUImageOpacityFilter.h"                   //不透明度#import "GPUImageHighlightShadowFilter.h"           //提亮阴影#import "GPUImageFalseColorFilter.h"                //色彩替换(替换亮部和暗部色彩)#import "GPUImageHueFilter.h"                       //色度#import "GPUImageChromaKeyFilter.h"                 //色度键#import "GPUImageWhiteBalanceFilter.h"              //白平横#import "GPUImageAverageColor.h"                    //像素平均色值#import "GPUImageSolidColorGenerator.h"             //纯色#import "GPUImageLuminosity.h"                      //亮度平均#import "GPUImageAverageLuminanceThresholdFilter.h" //像素色值亮度平均,图像黑白(有类似漫画效果)#import "GPUImageLookupFilter.h"                    //lookup 色彩调整#import "GPUImageAmatorkaFilter.h"                  //Amatorka lookup#import "GPUImageMissEtikateFilter.h"               //MissEtikate lookup#import "GPUImageSoftEleganceFilter.h"              //SoftElegance lookup#pragma mark - 图像处理 Handle Image#import "GPUImageCrosshairGenerator.h"              //十字#import "GPUImageLineGenerator.h"                   //线条#import "GPUImageTransformFilter.h"                 //形状变化#import "GPUImageCropFilter.h"                      //剪裁#import "GPUImageSharpenFilter.h"                   //锐化#import "GPUImageUnsharpMaskFilter.h"               //反遮罩锐化#import "GPUImageFastBlurFilter.h"                  //模糊#import "GPUImageGaussianBlurFilter.h"              //高斯模糊#import "GPUImageGaussianSelectiveBlurFilter.h"     //高斯模糊,选择部分清晰#import "GPUImageBoxBlurFilter.h"                   //盒状模糊#import "GPUImageTiltShiftFilter.h"                 //条纹模糊,中间清晰,上下两端模糊#import "GPUImageMedianFilter.h"                    //中间值,有种稍微模糊边缘的效果#import "GPUImageBilateralFilter.h"                 //双边模糊#import "GPUImageErosionFilter.h"                   //侵蚀边缘模糊,变黑白#import "GPUImageRGBErosionFilter.h"                //RGB侵蚀边缘模糊,有色彩#import "GPUImageDilationFilter.h"                  //扩展边缘模糊,变黑白#import "GPUImageRGBDilationFilter.h"               //RGB扩展边缘模糊,有色彩#import "GPUImageOpeningFilter.h"                   //黑白色调模糊#import "GPUImageRGBOpeningFilter.h"                //彩色模糊#import "GPUImageClosingFilter.h"                   //黑白色调模糊,暗色会被提亮#import "GPUImageRGBClosingFilter.h"                //彩色模糊,暗色会被提亮#import "GPUImageLanczosResamplingFilter.h"         //Lanczos重取样,模糊效果#import "GPUImageNonMaximumSuppressionFilter.h"     //非最大抑制,只显示亮度最高的像素,其他为黑#import "GPUImageThresholdedNonMaximumSuppressionFilter.h" //与上相比,像素丢失更多#import "GPUImageSobelEdgeDetectionFilter.h"        //Sobel边缘检测算法(白边,黑内容,有点漫画的反色效果)#import "GPUImageCannyEdgeDetectionFilter.h"        //Canny边缘检测算法(比上更强烈的黑白对比度)#import "GPUImageThresholdEdgeDetectionFilter.h"    //阈值边缘检测(效果与上差别不大)#import "GPUImagePrewittEdgeDetectionFilter.h"      //普瑞维特(Prewitt)边缘检测(效果与Sobel差不多,貌似更平滑)#import "GPUImageXYDerivativeFilter.h"              //XYDerivative边缘检测,画面以蓝色为主,绿色为边缘,带彩色#import "GPUImageHarrisCornerDetectionFilter.h"     //Harris角点检测,会有绿色小十字显示在图片角点处#import "GPUImageNobleCornerDetectionFilter.h"      //Noble角点检测,检测点更多#import "GPUImageShiTomasiFeatureDetectionFilter.h" //ShiTomasi角点检测,与上差别不大#import "GPUImageMotionDetector.h"                  //动作检测#import "GPUImageHoughTransformLineDetector.h"      //线条检测#import "GPUImageParallelCoordinateLineTransformFilter.h" //平行线检测#import "GPUImageLocalBinaryPatternFilter.h"        //图像黑白化,并有大量噪点#import "GPUImageLowPassFilter.h"                   //用于图像加亮#import "GPUImageHighPassFilter.h"                  //图像低于某值时显示为黑#pragma mark - 视觉效果 Visual Effect#import "GPUImageSketchFilter.h"                    //素描#import "GPUImageThresholdSketchFilter.h"           //阀值素描,形成有噪点的素描#import "GPUImageToonFilter.h"                      //卡通效果(黑色粗线描边)#import "GPUImageSmoothToonFilter.h"                //相比上面的效果更细腻,上面是粗旷的画风#import "GPUImageKuwaharaFilter.h"                  //桑原(Kuwahara)滤波,水粉画的模糊效果;处理时间比较长,慎用#import "GPUImageMosaicFilter.h"                    //黑白马赛克#import "GPUImagePixellateFilter.h"                 //像素化#import "GPUImagePolarPixellateFilter.h"            //同心圆像素化#import "GPUImageCrosshatchFilter.h"                //交叉线阴影,形成黑白网状画面#import "GPUImageColorPackingFilter.h"              //色彩丢失,模糊(类似监控摄像效果)#import "GPUImageVignetteFilter.h"                  //晕影,形成黑色圆形边缘,突出中间图像的效果#import "GPUImageSwirlFilter.h"                     //漩涡,中间形成卷曲的画面#import "GPUImageBulgeDistortionFilter.h"           //凸起失真,鱼眼效果#import "GPUImagePinchDistortionFilter.h"           //收缩失真,凹面镜#import "GPUImageStretchDistortionFilter.h"         //伸展失真,哈哈镜#import "GPUImageGlassSphereFilter.h"               //水晶球效果#import "GPUImageSphereRefractionFilter.h"          //球形折射,图形倒立#import "GPUImagePosterizeFilter.h"                 //色调分离,形成噪点效果#import "GPUImageCGAColorspaceFilter.h"             //CGA色彩滤镜,形成黑、浅蓝、紫色块的画面#import "GPUImagePerlinNoiseFilter.h"               //柏林噪点,花边噪点#import "GPUImage3x3ConvolutionFilter.h"            //3x3卷积,高亮大色块变黑,加亮边缘、线条等#import "GPUImageEmbossFilter.h"                    //浮雕效果,带有点3d的感觉#import "GPUImagePolkaDotFilter.h"                  //像素圆点花样#import "GPUImageHalftoneFilter.h"                  //点染,图像黑白化,由黑点构成原图的大致图形#pragma mark - 混合模式 Blend#import "GPUImageMultiplyBlendFilter.h"             //通常用于创建阴影和深度效果#import "GPUImageNormalBlendFilter.h"               //正常#import "GPUImageAlphaBlendFilter.h"                //透明混合,通常用于在背景上应用前景的透明度#import "GPUImageDissolveBlendFilter.h"             //溶解#import "GPUImageOverlayBlendFilter.h"              //叠加,通常用于创建阴影效果#import "GPUImageDarkenBlendFilter.h"               //加深混合,通常用于重叠类型#import "GPUImageLightenBlendFilter.h"              //减淡混合,通常用于重叠类型#import "GPUImageSourceOverBlendFilter.h"           //源混合#import "GPUImageColorBurnBlendFilter.h"            //色彩加深混合#import "GPUImageColorDodgeBlendFilter.h"           //色彩减淡混合#import "GPUImageScreenBlendFilter.h"               //屏幕包裹,通常用于创建亮点和镜头眩光#import "GPUImageExclusionBlendFilter.h"            //排除混合#import "GPUImageDifferenceBlendFilter.h"           //差异混合,通常用于创建更多变动的颜色#import "GPUImageSubtractBlendFilter.h"             //差值混合,通常用于创建两个图像之间的动画变暗模糊效果#import "GPUImageHardLightBlendFilter.h"            //强光混合,通常用于创建阴影效果#import "GPUImageSoftLightBlendFilter.h"            //柔光混合#import "GPUImageChromaKeyBlendFilter.h"            //色度键混合#import "GPUImageMaskFilter.h"                      //遮罩混合#import "GPUImageHazeFilter.h"                      //朦胧加暗#import "GPUImageLuminanceThresholdFilter.h"        //亮度阈#import "GPUImageAdaptiveThresholdFilter.h"         //自适应阈值#import "GPUImageAddBlendFilter.h"                  //通常用于创建两个图像之间的动画变亮模糊效果#import "GPUImageDivideBlendFilter.h"               //通常用于创建两个图像之间的动画变暗模糊效果

GPUImage美颜相机

  • GPUImageStillCamera用于拍摄当前手机的画面, 但是通常不会用实时视频的录制(使用另外一个), 主要用户拍摄某一个画面, 并且保存(显示)图片
  • GPUImageStillCamera->GPUImageFilter->GPUImageView 这样,摄像机转到滤镜再转到view上显示出来.
  • //可以理解为设备
    GPUImageStillCamera* imageCamera;
    //filter滤镜
    GPUImageFilter* filter;
    //显示出来的view
    GPUImageView* iv;
  • sessionPreset参数设置
  • class ViewController: UIViewController {@IBOutlet var imageView : UIImageView!fileprivate var stillCamera : GPUImageStillCamera?fileprivate var filter : GPUImageBrightnessFilter!override func viewDidLoad() {super.viewDidLoad()// 1.创建相机stillCamera = GPUImageStillCamera(sessionPreset: AVCaptureSessionPreset640x480, cameraPosition: .front)stillCamera?.outputImageOrientation = .portrait// 2.创建滤镜filter = GPUImageBrightnessFilter()filter.brightness = 0.3stillCamera?.addTarget(filter)// 3.创建显示实时画面的Viewlet showView = GPUImageView(frame: view.bounds)view.insertSubview(showView, at: 0)filter.addTarget(showView)}@IBAction func rotateCamera() {stillCamera?.startCapture()}@IBAction func start() {stillCamera?.rotateCamera()}@IBAction func stop() {stillCamera?.capturePhotoAsImageProcessedUp(toFilter: filter, withCompletionHandler: { (image :  UIImage?, error : Error?) inUIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)self.stillCamera?.stopCapture()})}
    }

    GPUImage滤镜效果(滤镜基本上都有属性可以设置,属性值设置的不同,滤镜效果不同)

    1、GPUImageSepiaFilter ,怀旧、褐色滤镜

    2、GPUImageHalftoneFilter ,中间色调、黑白滤镜

    3、GPUImageEmbossFilter, 浮雕滤镜

    4、GPUImageToonFilter ,卡通滤镜

    5、GPUImageSketchFilter  ,素描滤镜

    6、GPUImageZoomBlurFilter ,放缩毛玻璃滤镜

    7、GPUImageWhiteBalanceFilter,白平衡滤镜

    8、GPUImageVignetteFilter,晕映滤镜

    9、GPUImageTransformFilter,旋转滤镜

    10、GPUImageSwirlFilter,螺旋滤镜

    11、GPUImageStretchDistortionFilter,拉伸滤镜

    12、GPUImageSphereRefractionFilter,球面滤镜

    13、GPUImageSharpenFilter,尖锐滤镜

    14、GPUImageSaturationFilter,饱和度滤镜

    15、GPUImageRGBFilter,rgb滤镜

    16、GPUImagePosterizeFilter,色调分离滤镜

    17、GPUImagePolarPixellateFilter,边缘像素滤镜

    18、GPUImagePixellatePositionFilter,局部像素化(马赛克)滤镜

    19、GPUImagePixellateFilter,像素化(马赛克)滤镜

    20、GPUImagePinchDistortionFilter,拉伸滤镜

    21、GPUImageOpacityFilter,透明滤镜

    22、GPUImageMotionBlurFilter,单色模糊滤镜

    23、GPUImageMonochromeFilter,单色滤镜

    24、GPUImageLuminanceThresholdFilter,黑白灰度滤镜

    25、GPUImageLuminanceRangeFilter,灰度差值滤镜

    26、GPUImageLevelsFilter,色阶滤镜

    27、GPUImageKuwaharaRadius3Filter,叠原滤镜

    28、GPUImageHueFilter,色调滤镜

    29、GPUImageHighlightShadowFilter,高光阴影滤镜

    30、GPUImageHazeFilter,朦胧滤镜

    31、GPUImageGrayscaleFilter,黑白(灰度)滤镜

    32、GPUImageGammaFilter,灰度系数滤镜

    33、GPUImageFalseColorFilter,人工换色滤镜

    34、GPUImageExposureFilter,曝光度滤镜

    35、GPUImageDirectionalNonMaximumSuppressionFilter,定向抑制滤镜

    36、GPUImageCrosshatchFilter,交叉阴影滤镜

    37、GPUImageContrastFilter,对比度滤镜

    38、GPUImageColorPackingFilter,彩色包装滤镜

    39、GPUImageColorInvertFilter,反色滤镜

    40、GPUImageChromaKeyFilter,色键滤镜

    41、GPUImageCGAColorspaceFilter,CGA色彩滤镜

    42、GPUImageBulgeDistortionFilter,凸镜滤镜

    43、GPUImageBrightnessFilter,亮度滤镜

    44、GPUImageBoxBlurFilter,盒状模糊滤镜

    45、GPUImageGaussianBlurFilter,高斯模糊滤镜

    以上滤镜效果对应的代码如下

    //
    //  ViewController.swift
    //  GPUImageTest
    //
    //  Created by fe on 2018/6/12.
    //  Copyright © 2018年 fe. All rights reserved.
    //import UIKit
    import GPUImage
    class ViewController: UIViewController {fileprivate lazy var image : UIImage = UIImage(named: "test")!@IBOutlet var imageView: UIImageView!override func viewDidLoad() {super.viewDidLoad()}override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {self.imageView.image = gaussianBlur()}//0.使用GPUImage对图片做滤镜处理fileprivate func blurFilter(filter : GPUImageFilter) -> UIImage?{//1.使用GPUImage对图片进行高斯模糊处理(毛玻璃效果)//1.1获取GPUImagePicturelet gpuimagepic = GPUImagePicture(image: image)//1.2添加需要处理的滤镜gpuimagepic?.addTarget(filter)//1.3处理图片filter.useNextFrameForImageCapture()gpuimagepic?.processImage()//1.4取出最新的图片let newimage = filter.imageFromCurrentFramebuffer()return newimage}//1.高斯模糊(毛玻璃效果)滤镜fileprivate func gaussianBlur() -> UIImage?{//创建需要处理的滤镜let blurFilter = GPUImageGaussianBlurFilter()//纹理大小blurFilter.texelSpacingMultiplier = 3//每个像素点的模糊程度blurFilter.blurRadiusInPixels = 2return self.blurFilter(filter: blurFilter)}//2.盒状模糊滤镜fileprivate func boxBlurFilter()->UIImage?{let boxBlurFilter =  GPUImageBoxBlurFilter()return self.blurFilter(filter: boxBlurFilter)}//3.亮度滤镜fileprivate func brightnessFilter()->UIImage?{let brightnessFilter =  GPUImageBrightnessFilter()// Brightness ranges from -1.0 to 1.0, with 0.0 as the normal levelbrightnessFilter.brightness = 0.3return self.blurFilter(filter: brightnessFilter)}//4.凸镜滤镜fileprivate func bulgeDistortionFilter()->UIImage?{let bulgeDistortionFilter =  GPUImageBulgeDistortionFilter()bulgeDistortionFilter.center = CGPoint(x: 0.5, y: 0.5)bulgeDistortionFilter.radius = 0.5bulgeDistortionFilter.scale = 0.6return self.blurFilter(filter: bulgeDistortionFilter)}//5.CGA色彩滤镜,形成黑、浅蓝、紫色块的画面fileprivate func colorspaceFilter()->UIImage?{let colorspaceFilter =  GPUImageCGAColorspaceFilter()return self.blurFilter(filter: colorspaceFilter)}//6.色键滤镜,(smoothing = 0.1 ,thresholdSensitivity = 0.5 可以把背景替换为白色)fileprivate func chromaKeyFilter()->UIImage?{let chromaKeyFilter =  GPUImageChromaKeyFilter()chromaKeyFilter.smoothing = 0.12chromaKeyFilter.thresholdSensitivity = 0.5return self.blurFilter(filter: chromaKeyFilter)}//7.反色滤镜,X光效果fileprivate func colorInvertFilter()->UIImage?{let colorInvertFilter =  GPUImageColorInvertFilter()return self.blurFilter(filter: colorInvertFilter)}//8.彩色包装滤镜fileprivate func colorPackingFilter()->UIImage?{let colorPackingFilter =  GPUImageColorPackingFilter()return self.blurFilter(filter: colorPackingFilter)}//9.对比度滤镜fileprivate func contrastFilter()->UIImage?{let contrastFilter =  GPUImageContrastFilter()/** Contrast ranges from 0.0 to 4.0 (max contrast), with 1.0 as the normal level*/contrastFilter.contrast = 4.0return self.blurFilter(filter: contrastFilter)}//10.交叉阴影滤镜fileprivate func crosshatchFilter()->UIImage?{let crosshatchFilter =  GPUImageCrosshatchFilter()crosshatchFilter.crossHatchSpacing = 0.05crosshatchFilter.lineWidth = 0.002return self.blurFilter(filter: crosshatchFilter)}//11.定向抑制滤镜 fileprivate func suppressionFilter()->UIImage?{let suppressionFilter =  GPUImageDirectionalNonMaximumSuppressionFilter()//suppressionFilter.texelWidth = 0     //纹素像素宽度//suppressionFilter.texelHeight = 0    //文素像素高度//suppressionFilter.upperThreshold = 0 //亮度阀值//suppressionFilter.lowerThreshold = 0 //亮度阀值return self.blurFilter(filter: suppressionFilter)}//12.曝光度滤镜fileprivate func exposureFilter()->UIImage?{let exposureFilter =  GPUImageExposureFilter()exposureFilter.exposure = -1 //曝光度 -10~10 默认0return self.blurFilter(filter: exposureFilter)}//13.人工换色滤镜fileprivate func falseColorFilter()->UIImage?{let falseColorFilter = GPUImageFalseColorFilter()falseColorFilter.firstColor = GPUVector4(one: 0.8, two: 0.5, three: 0, four: 0.0) //用于替换图片上深色区域的颜色 ,设置参数类似RGBfalseColorFilter.secondColor = GPUVector4(one: 0.5, two: 0.8, three: 0.7, four: 0.0)//用于替换图片上浅色区域的颜色 ,设置参数类似RGBreturn self.blurFilter(filter: falseColorFilter)}//14.灰度系数滤镜fileprivate func gammaFilter()->UIImage?{let gammaFilter = GPUImageGammaFilter()gammaFilter.gamma = 2.0 // 灰度系数 0.0~3.0  默认 1.0return self.blurFilter(filter: gammaFilter)}//15.黑白(灰度)滤镜fileprivate func grayscaleFilter()->UIImage?{let grayscaleFilter = GPUImageGrayscaleFilter()return self.blurFilter(filter: grayscaleFilter)}//16.朦胧路径fileprivate func hazeFilter()->UIImage?{let hazeFilter = GPUImageHazeFilter()hazeFilter.distance = -0.3  //色强  -0.3 ~ 0.3 效果最好hazeFilter.slope = -0.3     //饱和度 -0.3 ~ 0.3 效果最好return self.blurFilter(filter: hazeFilter)}//17.高光阴影滤镜fileprivate func highlightShadowFilter()->UIImage?{let highlightShadowFilter = GPUImageHighlightShadowFilter()/*** 0 - 1, increase to lighten shadows.* @default 0*/highlightShadowFilter.highlights = 0.5/*** 0 - 1, decrease to darken highlights.* @default 1*/highlightShadowFilter.shadows =  0.8return self.blurFilter(filter: highlightShadowFilter)}//18.色调滤镜fileprivate func hueFilter()->UIImage?{let hueFilter = GPUImageHueFilter()hueFilter.hue = 100  //色度return self.blurFilter(filter: hueFilter)}//19.叠原滤镜fileprivate func kuwaharaFilter()->UIImage?{let kuwaharaFilter = GPUImageKuwaharaFilter()/// The radius to sample from when creating the brush-stroke effect, with a default of 3. The larger the radius, the slower the filter.kuwaharaFilter.radius = 2return self.blurFilter(filter: kuwaharaFilter)}//20.叠原滤镜radius = 3fileprivate func kuwaharaRadius3Filter()->UIImage?{let kuwaharaRadius3Filter = GPUImageKuwaharaRadius3Filter()return self.blurFilter(filter: kuwaharaRadius3Filter)}//21.色阶滤镜fileprivate func levelsFilter()->UIImage?{let levelsFilter = GPUImageLevelsFilter()levelsFilter.setGreenMin(0.0, gamma: 0.5, max: 0.9) //绿色levelsFilter.setBlueMin(0.5, gamma: 0.4, max: 0.5) //蓝色levelsFilter.setRedMin(0.5, gamma: 0.4, max: 0.5)  //红色return self.blurFilter(filter: levelsFilter)}//22.灰度差值滤镜fileprivate func luminanceRangeFilter()->UIImage?{let luminanceRangeFilter = GPUImageLuminanceRangeFilter()luminanceRangeFilter.rangeReductionFactor = 0.9return self.blurFilter(filter: luminanceRangeFilter)}//23.黑白灰度滤镜fileprivate func luminanceThresholdFilter()->UIImage?{let luminanceThresholdFilter = GPUImageLuminanceThresholdFilter()/** Anything above this luminance will be white, and anything below black. Ranges from 0.0 to 1.0, with 0.5 as the default*/luminanceThresholdFilter.threshold = 0.4return self.blurFilter(filter: luminanceThresholdFilter)}//24.单色滤镜fileprivate func monochromeFilter()->UIImage?{let monochromeFilter = GPUImageMonochromeFilter()monochromeFilter.intensity = 3  //光强return self.blurFilter(filter: monochromeFilter)}//25.单色模糊滤镜fileprivate func motionBlurFilter()->UIImage?{let motionBlurFilter = GPUImageMotionBlurFilter()/** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0*/motionBlurFilter.blurAngle = 0.5/** The angular direction of the blur, in degrees. 0 degrees by default*/motionBlurFilter.blurSize = 0.5return self.blurFilter(filter: motionBlurFilter)}//26.透明滤镜fileprivate func opacityFilter()->UIImage?{let opacityFilter = GPUImageOpacityFilter()// Opacity ranges from 0.0 to 1.0, with 1.0 as the normal settingopacityFilter.opacity = 0.5return self.blurFilter(filter: opacityFilter)}//27.拉伸滤镜fileprivate func pinchDistortionFilter()->UIImage?{let pinchDistortionFilter = GPUImagePinchDistortionFilter()/** The center about which to apply the distortion, with a default of (0.5, 0.5)*/pinchDistortionFilter.center = CGPoint(x: 0.5, y: 0.5)/** The radius of the distortion, ranging from 0.0 to 2.0, with a default of 1.0*/pinchDistortionFilter.radius = 1.5/** The amount of distortion to apply, from -2.0 to 2.0, with a default of 0.5*/pinchDistortionFilter.scale = 1.2return self.blurFilter(filter: pinchDistortionFilter)}//28.像素化滤镜(马赛克)fileprivate func pixellateFilter()->UIImage?{let pixellateFilter = GPUImagePixellateFilter()// The fractional width of the image to use as a size for the pixels in the resulting image. Values below one pixel width in the source image are ignored.pixellateFilter.fractionalWidthOfAPixel = 0.05return self.blurFilter(filter: pixellateFilter)}//29.局部像素化滤镜(马赛克)fileprivate func pixellatePositionFilter()->UIImage?{let pixellatePositionFilter = GPUImagePixellatePositionFilter()// The fractional width of the image to use as a size for the pixels in the resulting image. Values below one pixel width in the source image are ignored.pixellatePositionFilter.fractionalWidthOfAPixel = 0.05// the center point to start pixelation in texture coordinates, default 0.5, 0.5pixellatePositionFilter.center = CGPoint(x: 0.5, y: 0.10)// the radius (0.0 - 1.0) in which to pixelate, default 1.0pixellatePositionFilter.radius = 0.1return self.blurFilter(filter: pixellatePositionFilter)}//30.边缘像素滤镜fileprivate func polarPixellateFilter()->UIImage?{let polarPixellateFilter = GPUImagePolarPixellateFilter()// The center about which to apply the distortion, with a default of (0.5, 0.5)polarPixellateFilter.center = CGPoint(x: 0.5, y: 0.08)// The amount of distortion to apply, from (-2.0, -2.0) to (2.0, 2.0), with a default of (0.05, 0.05)polarPixellateFilter.pixelSize = CGSize(width: 0.01, height: 0.01)return self.blurFilter(filter: polarPixellateFilter)}//31.色调分离滤镜fileprivate func posterizeFilter()->UIImage?{let posterizeFilter = GPUImagePosterizeFilter()/** The number of color levels to reduce the image space to. This ranges from 1 to 256, with a default of 10.*/posterizeFilter.colorLevels = 3return self.blurFilter(filter: posterizeFilter)}//32.RGB滤镜fileprivate func rgbFilter()->UIImage?{let rgbFilter = GPUImageRGBFilter()// Normalized values by which each color channel is multiplied. The range is from 0.0 up, with 1.0 as the default.rgbFilter.red = 2rgbFilter.green = 2rgbFilter.blue = 2return self.blurFilter(filter: rgbFilter)}//33.饱和度滤镜fileprivate func saturationFilter()->UIImage?{let saturationFilter = GPUImageSaturationFilter()/** Saturation ranges from 0.0 (fully desaturated) to 2.0 (max saturation), with 1.0 as the normal level*/saturationFilter.saturation = 1.5return self.blurFilter(filter: saturationFilter)}//34.尖锐滤镜fileprivate func sharpenFilter()->UIImage?{let sharpenFilter = GPUImageSharpenFilter()// Sharpness ranges from -4.0 to 4.0, with 0.0 as the normal levelsharpenFilter.sharpness = -1return self.blurFilter(filter: sharpenFilter)}//35.球面滤镜fileprivate func sphereRefractionFilter()->UIImage?{let sphereRefractionFilter = GPUImageSphereRefractionFilter()/// The center about which to apply the distortion, with a default of (0.5, 0.5)sphereRefractionFilter.center = CGPoint(x: 0.5, y: 0.5)/// The radius of the distortion, ranging from 0.0 to 1.0, with a default of 0.25sphereRefractionFilter.radius = 0.4/// The index of refraction for the sphere, with a default of 0.71sphereRefractionFilter.refractiveIndex = 0.5return self.blurFilter(filter: sphereRefractionFilter)}//36.拉伸滤镜fileprivate func stretchDistortionFilter()->UIImage?{let stretchDistortionFilter = GPUImageStretchDistortionFilter()/** The center about which to apply the distortion, with a default of (0.5, 0.5)*/stretchDistortionFilter.center = CGPoint(x: 0.5, y: 0.5)return self.blurFilter(filter: stretchDistortionFilter)}//37.螺旋滤镜fileprivate func swirlFilter()->UIImage?{let swirlFilter = GPUImageSwirlFilter()/// The center about which to apply the distortion, with a default of (0.5, 0.5)swirlFilter.center = CGPoint(x: 0.5, y: 0.5)/// The radius of the distortion, ranging from 0.0 to 1.0, with a default of 0.5swirlFilter.radius = 0.5/// The amount of distortion to apply, with a minimum of 0.0 and a default of 1.0swirlFilter.angle = 0.25return self.blurFilter(filter: swirlFilter)}//38.旋转滤镜fileprivate func transformFilter()->UIImage?{let transformFilter = GPUImageTransformFilter()// You can either set the transform to apply to be a 2-D affine transform or a 3-D transform. The default is the identity transform (the output image is identical to the input).transformFilter.affineTransform = CGAffineTransform(a: 0.2, b: 0.1, c: 0.1, d: 0.5, tx: 0.1, ty: 0.1)//transformFilter.transform3D = CATransform3D(m11: 0, m12: 0, m13:  0, m14:  0, m21:  0.1, m22:  0, m23:  0, m24:  0.1, m31:  0.1, m32:  0, m33:  0, m34:  0, m41:  0, m42:  0, m43:  0, m44:  0.1)// This applies the transform to the raw frame data if set to YES, the default of NO takes the aspect ratio of the image input into account when rotatingtransformFilter.ignoreAspectRatio = false// sets the anchor point to top left cornertransformFilter.anchorTopLeft = truereturn self.blurFilter(filter: transformFilter)}//39.晕映滤镜fileprivate func vignetteFilter()->UIImage?{let vignetteFilter = GPUImageVignetteFilter()// the center for the vignette in tex coords (defaults to 0.5, 0.5)vignetteFilter.vignetteCenter = CGPoint(x: 0.5, y: 0.5)// The color to use for the Vignette (defaults to black)vignetteFilter.vignetteColor = GPUVector3(one: 100, two: 0, three: 255)// The normalized distance from the center where the vignette effect starts. Default of 0.5.vignetteFilter.vignetteStart = 0.45// The normalized distance from the center where the vignette effect ends. Default of 0.75.vignetteFilter.vignetteEnd = 0.75return self.blurFilter(filter: vignetteFilter)}//40.白平衡滤镜fileprivate func whiteBalanceFilter()->UIImage?{let whiteBalanceFilter = GPUImageWhiteBalanceFilter()//choose color temperature, in degrees KelvinwhiteBalanceFilter.temperature = 0.1//adjust tint to compensatewhiteBalanceFilter.tint = 0.1return self.blurFilter(filter: whiteBalanceFilter)}//41.放缩毛玻璃滤镜fileprivate func zoomBlurFilter()->UIImage?{let zoomBlurFilter = GPUImageZoomBlurFilter()/** A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0*/zoomBlurFilter.blurSize = 0.5/** The normalized center of the blur. (0.5, 0.5) by default*/zoomBlurFilter.blurCenter = CGPoint(x: 0.5, y: 0.5)return self.blurFilter(filter: zoomBlurFilter)}//42.怀旧滤镜fileprivate func sepiaFilter()->UIImage?{let sepiaFilter = GPUImageSepiaFilter()return self.blurFilter(filter: sepiaFilter)}//43.素描滤镜fileprivate func sketchFilter()->UIImage?{let sketchFilter = GPUImageSketchFilter()return self.blurFilter(filter: sketchFilter)}//44.卡通滤镜fileprivate func toonFilter()->UIImage?{let toonFilter = GPUImageToonFilter()/** The threshold at which to apply the edges, default of 0.2*/toonFilter.threshold = 0.3/** The levels of quantization for the posterization of colors within the scene, with a default of 10.0*/toonFilter.quantizationLevels = 20return self.blurFilter(filter: toonFilter)}//45.浮雕滤镜fileprivate func embossFilter()->UIImage?{let embossFilter = GPUImageEmbossFilter()// The strength of the embossing, from  0.0 to 4.0, with 1.0 as the normal levelembossFilter.intensity = 4.0return self.blurFilter(filter: embossFilter)}//46.中间色调、黑白滤镜fileprivate func halftoneFilter()->UIImage?{let halftoneFilter = GPUImageHalftoneFilter()return self.blurFilter(filter: halftoneFilter)}}
    

    GPUImage实现视频直播实时美颜

  • //
    //  ViewController.swift
    //  BeautyCamera
    //
    //  Created by fe on 18/06/26.
    //  Copyright © 2018年 fe. All rights reserved.
    //import UIKit
    import GPUImage
    import AVKitclass ViewController: UIViewController {@IBOutlet weak var beautyViewBottomCons: NSLayoutConstraint!// MARK: 懒加载属性// 创建视频源fileprivate lazy var camera : GPUImageVideoCamera? = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPresetHigh, cameraPosition: .front)// 创建预览图层fileprivate lazy var preview : GPUImageView = GPUImageView(frame: self.view.bounds)// 初始化滤镜let bilateralFilter = GPUImageBilateralFilter() // 磨皮let exposureFilter = GPUImageExposureFilter() // 曝光let brightnessFilter = GPUImageBrightnessFilter() // 美白let satureationFilter = GPUImageSaturationFilter() // 饱和// 创建写入对象fileprivate lazy var movieWriter : GPUImageMovieWriter = { [unowned self] in// 创建写入对象let writer = GPUImageMovieWriter(movieURL: self.fileURL, size: self.view.bounds.size)// 设置写入对象的属性return writer!}()// MARK: 计算属性var fileURL : URL {return URL(fileURLWithPath: "\(NSTemporaryDirectory())123.mp4")}override func viewDidLoad() {super.viewDidLoad()print(fileURL)// 1.设置camera方向camera?.outputImageOrientation = .portraitcamera?.horizontallyMirrorFrontFacingCamera = true// 2.创建预览的Viewview.insertSubview(preview, at: 0)// 3.获取滤镜组let filterGroup = getGroupFilters()// 4.设置GPUImage的响应链camera?.addTarget(filterGroup)filterGroup.addTarget(preview)// 5.开始采集视频camera?.startCapture()// 6.设置writer的属性// 是否对视频进行编码movieWriter.encodingLiveVideo = true// 将writer设置成滤镜的targetfilterGroup.addTarget(movieWriter)// 设置camera的编码camera?.delegate = selfcamera?.audioEncodingTarget = movieWriterlet fileManage = FileManager()if fileManage.fileExists(atPath: "\(NSTemporaryDirectory())123.mp4") {try? fileManage.removeItem(atPath: "\(NSTemporaryDirectory())123.mp4")}movieWriter.startRecording()}fileprivate func getGroupFilters() -> GPUImageFilterGroup{// 1.创建滤镜组(用于存放各种滤镜:美白、磨皮等等)let filterGroup = GPUImageFilterGroup()// 2.创建滤镜(设置滤镜的引来关系)bilateralFilter.addTarget(brightnessFilter)brightnessFilter.addTarget(exposureFilter)exposureFilter.addTarget(satureationFilter)// 3.设置滤镜组链初始&终点的filterfilterGroup.initialFilters = [bilateralFilter]filterGroup.terminalFilter = satureationFilterreturn filterGroup}
    }// MARK:- 控制方法
    extension ViewController {@IBAction func rotateCamera() {camera?.rotateCamera()}@IBAction func adjustBeautyEffect() {adjustBeautyView(constant: 0)}@IBAction func finishedBeautyEffect() {adjustBeautyView(constant: -250)}@IBAction func switchBeautyEffect(switchBtn : UISwitch) {if switchBtn.isOn {camera?.removeAllTargets()let group = getGroupFilters()camera?.addTarget(group)group.addTarget(preview)} else {camera?.removeAllTargets()camera?.addTarget(preview)}}private func adjustBeautyView(constant : CGFloat) {beautyViewBottomCons.constant = constantUIView.animate(withDuration: 0.5) {self.view.layoutIfNeeded()}}@IBAction func changeSatureation(_ sender: UISlider) {print(sender.value)satureationFilter.saturation = CGFloat(sender.value * 2)}@IBAction func changeBrightness(_ sender: UISlider) {// - 1 --> 1brightnessFilter.brightness = CGFloat(sender.value) * 2 - 1}@IBAction func changeExposure(_ sender: UISlider) {// - 10 ~ 10exposureFilter.exposure = CGFloat(sender.value) * 20 - 10}@IBAction func changeBilateral(_ sender: UISlider) {bilateralFilter.distanceNormalizationFactor = CGFloat(sender.value) * 8}
    }extension ViewController : GPUImageVideoCameraDelegate {func willOutputSampleBuffer(_ sampleBuffer: CMSampleBuffer!) {print("采集到画面")}
    }extension ViewController {@IBAction func stopRecording() {camera?.stopCapture()preview.removeFromSuperview()movieWriter.finishRecording()}@IBAction func playVideo() {print(fileURL)let playerVc = AVPlayerViewController()playerVc.player = AVPlayer(url: fileURL)present(playerVc, animated: true, completion: nil)}
    }
    

《音视频直播------GPUImage》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. java中string与byte[]的转换
  2. MYSQL远程连接失败:ERROR 1130: mysql 1130连接错误的有效解決方法
  3. 按位与 matlab,c# 按位与,按位或
  4. 深入LINQ | 动态构建LINQ表达式
  5. Educational Codeforces Round 81 (Rated for Div. 2) D. Same GCDs 欧拉函数\莫比乌斯
  6. 产生复选框的html,html根据复选框勾选顺序生成字符串
  7. 红帽RHEL8和RHEL7有什么区别?
  8. CSS3导入字体后用另外一种索引去加载字体里面的字符的问题。
  9. numpy—np.diag(v, k=0)
  10. 如何从Mac桌面隐藏各种标准图标?
  11. leetcode 148. Sort List ----- java
  12. 中国汽车改装行业运营模式分析及投资战略规划研究报告2021年版
  13. ar面部识别_AR人脸识别数据集
  14. 6 RFID的ISOIEC标准
  15. 分享五个最好的BT下载软件
  16. html怎么设置章节,奇数页眉设置成章节名 假设此处需要显示的是章对应内容
  17. 程序员 -- 当我彻底放弃自私自利后,前途变得一片光明,不能过多的只是关注自己的功夫,生活不能只局限在方寸虚拟世界里
  18. java开发一个简单的通讯录
  19. 第十三届蓝桥杯大赛JavaB个人赛题题解
  20. The Fool HDU 6555 思维/数论

热门文章

  1. mac 彻底卸载sublime txt3
  2. 中望3D 2021 “拔模”命令使用曲面做中性面
  3. 义乌个体户注册流程和注意事项
  4. 2021年通州中学高考成绩查询,2021年北京市通州区各中学中考成绩排名及创新高...
  5. badblocks命令来检查硬盘是否有坏道
  6. 抖音如何打造热门直播间,新手必知直播干货丨国仁网络
  7. 千兆无线网络 敲响有线网络的丧钟
  8. 2021年二级建造师课件资料汇总-精讲班
  9. mysql 触发器delimiter_Mysql中的delimiter详解
  10. 第十三届蓝桥杯省赛第一场个人题解(2022年)