初探iOS中的滤镜及CoreImage

在iOS应用中,有一类应用很受广大妹纸们的青睐,那就是美图类应用。大家都喜欢在自拍后给照片加一个滤镜效果,让照片看起来更加有“文艺范”。在iOS内置框架中,为我们提供了一套十分丰富的滤镜效果。刚好这期的objc中国也是介绍相机与照片,也介绍如何用Core Image这个框架来为照片添加滤镜效果,objc中国里的例子是用swift来实现的,这篇博客我们将用objective-c来实现一个例子,并对使用方法进行一些总结。

首先我们介绍2个基本概念: 滤镜滤镜图表

  • 滤镜是一个对象,通过为其配置输入源和变换规则(滤镜效果),就可以输出一个有滤镜效果的图片。
  • 滤镜图表是一组链接在一起的滤镜网络,一个滤镜的输出可以是另一个滤镜的输入,即将多个滤镜效果串行的组合在一起使用。以这种方式,可以实现出很多精心制作的效果。

iOS上可用的滤镜效果是OS X上可以滤镜效果的子集。在OS X上游169个内置滤镜效果,iOS上则有127个。可以在这里查询到滤镜的名称和显示效果,也可以通过以下代码查询:

NSArray *filterNames = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];

图像滤镜的工作主要由三个部分组成:创建输入图像构建和配置滤镜图表得到滤镜处理后的图像
1、创建输入图像
Core Image 滤镜要求其输入图像是 CIImage 类型,因此我们要使用CIImage类来创建图像。
2、构建和配置滤镜图表
构建一个滤镜图表由这几个部分组成:实例化我们需要的滤镜,设置它们的参数,把它们连接起来以便该图像数据按顺序传过每个滤镜。我们要使用到CIFilter类。
3、滤镜处理后的图像
滤镜都有一个名为 outputImage 的属性,但是它也是 CIImage 类型的,而我们比较常用的是UIImage和UIImageView。因此,如果我们要将CIImage转换到UIImage的话,还要借助CIContext类,将CIImage先过渡到CGImageRef,然后在通过UIImage类中的imageWithCGImage:方法最终获得UIImage。

下面我们将具体通过代码来展示滤镜工作的过程:

    // 1、创建输入图像,CIImage类型,这里使用一个网上图片。
    CIImage *inputImage = [CIImage imageWithContentsOfURL:[NSURL URLWithString:@"http://g.hiphotos.baidu.com/super/whfpf%3D425%2C260%2C50/sign=75939ccea21ea8d38a772744f137047c/9213b07eca8065384abe8f6693dda144ad34826a.jpg"]];
    
    // 2、构建一个滤镜图表
    CIColor *sepiaColor = [CIColor colorWithRed:0.76 green:0.65 blue:0.54];
    // 2.1 先构建一个 CIColorMonochrome 滤镜,并配置输入图像与滤镜参数
    CIFilter *monochromeFilter = [CIFilter filterWithName:@"CIColorMonochrome" withInputParameters:@{@"inputColor" : sepiaColor,
                              @"inputIntensity":@1.0}];
    [monochromeFilter setValue:inputImage forKey:@"inputImage"];// 通过KVC来设置输入图像
    // 2.2 先构建一个 CIVignette 滤镜
    CIFilter *vignetteFilter = [CIFilter filterWithName:@"CIVignette" withInputParameters:@{@"inputRadius" : @2.0,
                              @"inputIntensity" : @1.0}];
    [vignetteFilter setValue:monochromeFilter.outputImage forKey:@"inputImage"];// 以monochromeFilter的输出来作为输入
    
    // 3、得到一个滤镜处理后的图片,并转换至 UIImage
    // 创建一个 CIContext
    CIContext *ciContext = [CIContext contextWithOptions:nil];
    // 将 CIImage 过渡到 CGImageRef 类型
    CGImageRef cgImage = [ciContext createCGImage:vignetteFilter.outputImage fromRect:inputImage.extent];
    // 最后转换为 UIImage 类型
    UIImage *uiImage = [UIImage imageWithCGImage:cgImage];
上述2个滤镜的效果

你可能感兴趣的:(初探iOS中的滤镜及CoreImage)