CoreImage 及滤镜效果

参考网址: 感谢 出其东门

做过 iOS 开发的人,对core这个字眼一定不陌生,它总是代表着或者底层的,或者牛叉的,或者底层牛叉的Apple 自己的框架.

CoreImage 让你可以简单的应用滤镜来处理图片,比如修改饱和度,亮度,对比度等东西(对了解 PS 的人来说,非常的亲切吧).

它利用GPU(或者CPU,取决于客户)来非常快速、甚至实时地处理图像数据和视频的帧。多个Core Image滤镜可以叠加在一起,从而可以一次性地产生多重滤镜效果。

Mac上只有一部分Core Image滤镜可以在iOS上使用。但是随着这些可使用滤镜的数目越来越多,API可以用来发现新的滤镜属性。

我们可以使用如下代码来打印支持的滤镜:

NSArray *filters = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];NSLog(@”%@”, filters);[filters count];NSLog(@”一共有 %d 种 CIFilter 滤镜效果”, [filters count]);

我的输出是: 127种

CoreImage 的概览 开始之前,让我们谈谈Core Image框架中最重要的几个类:

基本的图像滤镜

作为第一个尝试,我们先简单的让图像通过一个CIFilter 之后显示在屏幕上。每一次当我们想应用一个CIFilter的时候都要有以下四个步骤:

// 1NSString *filePath = [[NSBundle mainBundle] pathForResource:@”image” ofType:@”png”];NSURL *fileNameAndPath = [NSURL fileURLWithPath:filePath];// 2CIImage *beginImage = [CIImage imageWithContentsOfURL:fileNameAndPath];// 3CIFilter *filter = [CIFilter filterWithName:@”CISepiaTone”keysAndValues: kCIInputImageKey, beginImage,@”inputIntensity”, @0.8, nil];CIImage *outputImage = [filter outputImage];// 4UIImage *newImage = [UIImage imageWithCIImage:outputImage];= newImage;

让我们依次看看这些代码都做了什么事情

原图:

效果图:

把它放在上下文中

在进行下一步之前,有一个优化的方法很实用。我前面提到过,你需要一个CIContext来进行CIFilter,但是在上面的例子中我们没有提到这个对象。因为我们调用的UIImage方法(imageWithCIImage)已经自动地为我们完成了这个步骤。它生成了一个CIContext并且用它来处理图像的过滤。这使得调用Core Image的接口变得很简单。

但是,有一个主要的问题是,它的每次调用都会生成一个CIContext。CIContext本来是可以重用以便提高性能和效率的。比如下面我们要谈到的例子,,如果你想用滑动条来选择过滤参数取值,每次改变滤镜参数都会自动生成一个CIContext, 使得性能非常差。

让我们想个好办法搞定这个问题。删除你之前添加到viewDidLoad里面的代码,用下面的代码取而代之:

CIImage *beginImage = [CIImage imageWithContentsOfURL:fileNameAndPath];// 1CIContext *context = [CIContext contextWithOptions:nil];CIFilter *filter = [CIFilter filterWithName:@”CISepiaTone”keysAndValues: kCIInputImageKey, beginImage,@”inputIntensity”, @0.8, nil];CIImage *outputImage = [filter outputImage];// 2CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];// 3UIImage *newImage = [UIImage imageWithCGImage:cgimg];= newImage;// 4CGImageRelease(cgimg);

再让我逐步解释一下这部分代码

最后,开放 CGImageRef接口。 CGImage 是一个C接口,即使有ARC,也需要你自己来做内存管理。

编译运行,确保正常工作。

在这个例子中,添加CIContext的创建 和你自己来创建的区别不大。但是,在动态改变滤镜参数的时候的时候,能看出重大性能差别。

每一发奋美文努力的背后,必有加倍的赏赐。

CoreImage 及滤镜效果

相关文章:

你感兴趣的文章:

标签云: