滤镜之CoreImage

2018-07-03  本文已影响14人  melody5

CoreImage是苹果自带的关于图像处理的框架,不仅可以做滤镜,还可以做人脸识别,我们今天先来简单的了解一下滤镜的功能,下次有机会再写人脸识别的部分。

先看效果图:

image.png

上边是原图,下边是添加了结晶的模糊滤镜效果图。

步骤:

  1. 创建CIImage实例,获取图片资源
  2. 根据滤镜名称创建滤镜CIFilter
  3. 设置滤镜参数(KVC方式设置)
  4. 创建绘制上下文,CIContext对象(两种方式,一种GPU渲染,另一种CPU渲染)
  5. 获取渲染后的图片资源CIImage
  6. 创建CGImageRef句柄
  7. 从句柄中取出图片UIImage
  8. 释放CGImageRef句柄
  9. 将渲染完成的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;

}

滤镜名称可以查看官方文档

image.png
总共有14个大分类,每个大分类里又有很多具体的滤镜。点开名称可以看见具体的描述,属性,以及属性的类型和用法,还有效果图。
image.png
我们也可以通过NSLog(@"%@",filter.attributes);来获得当前滤镜的属性的信息。滤镜类型大概二百种左右吧,用法都差不多,大家自己探索一下吧。
上一篇下一篇

猜你喜欢

热点阅读