滤镜之CoreImage
2018-07-03 本文已影响14人
melody5
CoreImage是苹果自带的关于图像处理的框架,不仅可以做滤镜,还可以做人脸识别,我们今天先来简单的了解一下滤镜的功能,下次有机会再写人脸识别的部分。
先看效果图:
image.png上边是原图,下边是添加了结晶的模糊滤镜效果图。
步骤:
- 创建CIImage实例,获取图片资源
- 根据滤镜名称创建滤镜CIFilter
- 设置滤镜参数(KVC方式设置)
- 创建绘制上下文,CIContext对象(两种方式,一种GPU渲染,另一种CPU渲染)
- 获取渲染后的图片资源CIImage
- 创建CGImageRef句柄
- 从句柄中取出图片UIImage
- 释放CGImageRef句柄
- 将渲染完成的UIImage放到页面显示
代码
- (IBAction)change:(id)sender {
//获取图片资源,imageview.image是原图
CIImage *image = [[CIImage alloc] initWithImage:self.preImageView.image];
//根据滤镜名称创建滤镜
CIFilter *filter = [CIFilter filterWithName:@"CICrystallize" keysAndValues:kCIInputImageKey,image, nil];
// NSLog(@"%@",[CIFilter filterNamesInCategory:kCICategoryDistortionEffect]);
NSLog(@"%@",filter.attributes);
//这里使用的是默认参数,也可自己设置
// [filter setDefaults];
[filter setValue:@(50.0) forKey:@"inputRadius"];
//创建绘制上下文,默认使用GPU绘制
CIContext *context = [CIContext contextWithOptions:nil];
//创建基于 GPU 的 CIContext 对象
// EAGLContext *gpucontext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
// CIContext *context = [CIContext contextWithEAGLContext: gpucontext];
//创建基于 CPU 的 CIContext 对象
// CIContext *context = [CIContext contextWithOptions: [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:kCIContextUseSoftwareRenderer]];
// 渲染并输出CIImage
CIImage *outputImage = [filter outputImage];
// 创建CGImage句柄
CGImageRef Cgimage = [context createCGImage:outputImage fromRect:[outputImage extent]];
// 取出图片
UIImage *showimage = [UIImage imageWithCGImage:Cgimage];
// 释放CGImage句柄
CGImageRelease(Cgimage);
// 加滤镜之后的图片
self.finishImageView.image = showimage;
}
滤镜名称可以查看官方文档
总共有14个大分类,每个大分类里又有很多具体的滤镜。点开名称可以看见具体的描述,属性,以及属性的类型和用法,还有效果图。
image.png
我们也可以通过
NSLog(@"%@",filter.attributes);
来获得当前滤镜的属性的信息。滤镜类型大概二百种左右吧,用法都差不多,大家自己探索一下吧。