在OpenGLES下进行滤镜的渲染可以提高效率。
如果需要实时查看多个滤镜动态渲染的效果,使用OpenGLES是一个好的选择
@interface ViewController ()
@property (nonatomic, strong) GLKView *glkView; // 渲染用的buffer视图
@property (nonatomic, strong) CIFilter *filter;
@property (nonatomic, strong) CIImage *ciImage;
@property (nonatomic, strong) CIContext *ciContext;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIImage *showImage = [UIImage imageNamed:@"demo"];
CGRect rect = CGRectMake(0, 0, showImage.size.width, showImage.size.height);
// 获取OpenGLES渲染的上下文
EAGLContext *eagContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
// 创建出渲染的buffer
_glkView = [[GLKView alloc] initWithFrame:rect
context:eagContext];
[_glkView bindDrawable];
[self.view addSubview:_glkView];
// 创建出CoreImage用的上下文
_ciContext = [CIContext contextWithEAGLContext:eagContext
options:@{kCIContextWorkingColorSpace : [NSNull null]}];
// CoreImage相关设置
_ciImage = [[CIImage alloc] initWithImage:showImage];
_filter = [CIFilter filterWithName:@"CISepiaTone"];
[_filter setValue:_ciImage forKey:kCIInputImageKey];
[_filter setValue:@(0) forKey:kCIInputIntensityKey];
// 开始渲染
[_ciContext drawImage:[_filter outputImage]
inRect:CGRectMake(0, 0, _glkView.drawableWidth, _glkView.drawableHeight)
fromRect:[_ciImage extent]];
[_glkView display];
// 动态渲染
UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(0, 400, 320, 20)];
slider.minimumValue = 0.f;
slider.maximumValue = 1.f;
[slider addTarget:self action:@selector(sliderEvent:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:slider];
}
- (void)sliderEvent:(UISlider *)slider {
[_filter setValue:_ciImage forKey:kCIInputImageKey];
[_filter setValue:@(slider.value)
forKey:kCIInputIntensityKey];
// 开始渲染
[_ciContext drawImage:[_filter outputImage]
inRect:CGRectMake(0, 0, _glkView.drawableWidth, _glkView.drawableHeight)
fromRect:[_ciImage extent]];
[_glkView display];
}
@end