美文网首页
Swift如何更优雅的添加GPUImage滤镜

Swift如何更优雅的添加GPUImage滤镜

作者: QYiZHong | 来源:发表于2018-09-28 18:09 被阅读45次

    GPUImage的滤镜是通过不同的文件实现不同的滤镜效果,如果因为这样写一排if判断不同的cell需要显示的滤镜未免太粗暴了,所以需要更为优雅的方式,本文采用枚举的方式去动态添加滤镜

    直接上代码demo

    enum GPUFilterStyle: String, CaseIterable {
    case sketch = "GPUImageSketchFilter"
    case toon = "GPUImageToonFilter"
    case smoothToon = "GPUImageSmoothToonFilter"
    
    var title: String {
        switch self {
        case .sketch: return "sketch"
        case .toon: return "toon"
        case .smoothToon: return "sToon"
        }
    }
    
    var instance: GPUImageOutput {
        let filterClass: AnyClass = NSClassFromString(self.rawValue)!
        let realClass = filterClass as! GPUImageOutput.Type
        return realClass.init()
    }
    }
    

    这个枚举里的case是类名,里面有两个变量。一个是title,表示每个case作为滤镜需要显示的名字。一个是instance,用来动态的初始化一个滤镜。因为各种滤镜和输出都继承GPUImageOutput这个父类,所以返回的类型是GPUImageOutput就可以。一开始直接返回GPUImageFilter,发现有一些滤镜初始化的时候会报错,原因是这些滤镜的父类中没有GPUImageFilter,神奇

    然后使用的时候

    var dataArray: Array<FilterModel> = []
            for style in GPUFilterStyle.allCases {
                let filter = style.instance
                let filterImage = filter.image(byFilteringImage: image)
                let model = FilterModel.init()
                model.filterImage = filterImage
                model.title = style.title
                dataArray.append(model)
            }
    

    这样就实现了比较优雅的初始化方式

    最后,有些滤镜启动是很慢的,那些建议不要这么做

    相关文章

      网友评论

          本文标题:Swift如何更优雅的添加GPUImage滤镜

          本文链接:https://www.haomeiwen.com/subject/zknpoftx.html