美文网首页
滤镜之CoreImage

滤镜之CoreImage

作者: melody5 | 来源:发表于2018-07-03 16:42 被阅读14次

    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);来获得当前滤镜的属性的信息。滤镜类型大概二百种左右吧,用法都差不多,大家自己探索一下吧。

    相关文章

      网友评论

          本文标题:滤镜之CoreImage

          本文链接:https://www.haomeiwen.com/subject/yajluftx.html