• 关于GPUImage之滤镜


    iOS GUPImage 滤镜


    最近时间充裕,准备好好研究下GPUImage这个十分强大的图像处理库,做下笔记,以便和大家探讨交流,不足之处望指正。
    以前项目需求中,一个界面需要毛玻璃特效,术语叫高斯模糊,为了这个特效,研究了不少东西,先是想从CoreImage即苹果系统库入手,发觉实现难度颇高,后来想了个办法,用了UIToolBar这个控件勉强实现了特效,但始终不甚理想,iOS8之后苹果有了高斯模糊API,就好做了,即UIVisualEffectView
    在此期间认识了GPUImage,知道它能够处理图像各种滤镜,其强大深深地吸引了我,那么就先探究下它的125种滤镜,其中就包括高斯模糊。
    先上代码:

    /// 高斯模糊
    fileprivate func setupFilter() {
        // 1. 需要处理的图片
        let image = UIImage(named: "mm")
                
        // 2. 创建GPUImagePicture
        let processImage = GPUImagePicture(image: image)
                
        // 3. 添加对应的滤镜
        let blurFilter = GPUImageGaussianBlurFilter()
        blurFilter.blurRadiusInPixels = 10
        blurFilter.texelSpacingMultiplier = 1
                
        // 4. 将滤镜添加到processImage
        processImage?.addTarget(blurFilter)
                
        // 5. 使用滤镜处理一下显示的该图片
        blurFilter.useNextFrameForImageCapture()
        processImage?.processImage()
                
        // 6. 获取最新的图片
        self.bgImageView.image = blurFilter.imageFromCurrentFramebuffer()
    }
    

    如此,就实现了高斯模糊,十分方便,而且相较于系统API,GPUImage的性能更优,因为它是基于GPU的。
    在大多数照片美化APP中,那些各种各样的滤镜处理,对于一个从未接触过图像处理的开发者来说,会头大如斗,不知该如何入手,就目前而言,GPUImage是我见过的最强大的图像处理库了,其125种滤镜涵盖了你想都想不到的功能,列举几种实用的滤镜如下:

        #import "GPUImageBrightnessFilter.h"                //亮度
        #import "GPUImageExposureFilter.h"                  //曝光
        #import "GPUImageSaturationFilter.h"                //饱和度
        #import "GPUImageColorInvertFilter.h"               //反色
        #import "GPUImageSepiaFilter.h"                     //褐色(怀旧)
        #import "GPUImageGrayscaleFilter.h"                 //灰度
        #import "GPUImageFastBlurFilter.h"                  //模糊
        #import "GPUImageGaussianBlurFilter.h"              //高斯模糊
        #import "GPUImageSketchFilter.h"                    //素描
        #import "GPUImageEmbossFilter.h"                    //浮雕效果,带有点3d的感觉
    

    那么知道了这些滤镜,想要做图片滤镜就简单了许多,使用cocoa pods集成pod "GPUImage",然后封装一个给图片添加滤镜的函数即可:

    private func processImageWithFilter(_ filter: GPUImageFilter) {
        // 获取到需要处理的图片
        let image = UIImage(named: "mm")
        let processImage = GPUImagePicture(image: image)
        processImage?.addTarget(filter)
            
        // 使用滤镜处理
        // 这里要注意的是,处理图片会阻塞主线程,所以在正式的开发中还是放在子线程中
        filter.useNextFrameForImageCapture()
        processImage?.processImage()
    
        // 更新UI(如果上面使用了子线程,那么下面就需要回到主线程)
        self.bgImageView.image = filter.imageFromCurrentFramebuffer()
    }
    

    那么,接下来创建滤镜,调用processImageWithFilter()函数:

    /// 浮雕
        fileprivate func setupFilter5() {
            let embossFilter = GPUImageEmbossFilter()
            
            processImageWithFilter(embossFilter)
        }
        
        /// 素描
        fileprivate func setupFilter4() {
            let sketchFilter = GPUImageSketchFilter()
            
            processImageWithFilter(sketchFilter)
        }
        
        /// 灰度
        fileprivate func setupFilter3() {
            let grayFilter = GPUImageGrayscaleFilter()
            
            processImageWithFilter(grayFilter)
        }
        
        /// 颜色反转
        fileprivate func setupFilter2() {
            let invertFilter = GPUImageColorInvertFilter()
            
            processImageWithFilter(invertFilter)
        }
    

    当然,上面只是其中几种滤镜而已,剩下的可按需要,自行添加即可,效果图如下:

    浮雕效果.png
    素描效果.png
    高斯模糊.png
  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/12881532.html
Copyright © 2020-2023  润新知