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

2018-09-28  本文已影响45人  QYiZHong

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)
        }

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

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

上一篇下一篇

猜你喜欢

热点阅读