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)
}
这样就实现了比较优雅的初始化方式
最后,有些滤镜启动是很慢的,那些建议不要这么做
网友评论