CoreImage 及滤镜效果

参考网址:http://blog.sina.com.cn/s/blog_92ac2c5b0101cm5b.html

感谢 出其东门

做过 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框架中最重要的几个类:

  • CIContext. 所有图像处理都是在一个CIContext 中完成的,这很像是一个Core Image处理器或是OpenGL的上下文。
  • CIImage. 这个类保存图像数据。它可以从UIImage、图像文件、或者是像素数据中构造出来。
  • CIFilter. 滤镜类包含一个字典结构,对各种滤镜定义了属于他们各自的属性。滤镜有很多种,比如鲜艳程度滤镜,色彩反转滤镜,剪裁滤镜等等。

基本的图像滤镜

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

  1. 创建一个 CIImage 对象: CIImage 有如下的初始化方法: imageWithURL:imageWithData:imageWithCVPixelBuffer:, 和 imageWithBitmapData:bytesPerRow:size:format:colorSpace:。但是大多数时候你只会经常用到imageWithURL
  2. 创建一个 CIContext: 一个 CIContext 可以是基于CPU或是GPU的。它可以被重用,所以你不用每次都创建一个。但是当输出CIImage对象的时候你至少一定会需要一个CIContext。
  3. 创建一个CIFilter: 当你创建滤镜的时候,你可以在上面配置一定数量的属性。具体的属性取决于你所要用的滤镜。
  4. 输出滤镜:这个滤镜会输出一个图像成为CIImage。 你可以用CIContext把它转化为一个UIImage ,具体过程如下。
// 1
NSString *filePath =
  [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"];
NSURL *fileNameAndPath = [NSURL fileURLWithPath:filePath];

// 2
CIImage *beginImage =
  [CIImage imageWithContentsOfURL:fileNameAndPath];

// 3
CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"
                              keysAndValues: kCIInputImageKey, beginImage,
                    @"inputIntensity", @0.8, nil];
CIImage *outputImage = [filter outputImage];

// 4
UIImage *newImage = [UIImage imageWithCIImage:outputImage];
self.imageView.image = newImage;

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

  1. 前两行创建了一个NSURL 对象, 包含指向图形文件的路径。
  2. 下面,用imageWithContentsOfURL方法创建CIImage。
  3. 之后,创建CIFilter对象。一个 CIFilter 构造函数有两个输入,分别是滤镜的名字,还有规定了滤镜属性的键值和取值的字典。 每一个滤镜会有它自己唯一的键值和一组有效的取值。CISepiaTone 滤镜只能选两个值: KCIInputImageKey (一个CIImage) 和 @”inputIntensity”。 后者是一个封装成NSNumber (用新的文字型语法)的浮点小数,取值在0和1 之间。大部分的滤镜有默认值,只有CIImage是个例外。你必须提供一个值给它,因为它没有默认值。从滤镜中导出CIImage很简单,只需要用outputImage方法。
  4. 一旦你有了导出的 CIImage,你就可以把它转化为一个 UIImage。 在新的iOS6中,UIImage 方法+ imageWithCIImage方法可以实现从CIImage 到UIImage 到转化。一旦转化完成,我们就可以让UIImage 显示在之前添加的图像视图里。

原图:

效果图:

把它放在上下文中

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

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

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

CIImage *beginImage =
  [CIImage imageWithContentsOfURL:fileNameAndPath];

// 1
CIContext *context = [CIContext contextWithOptions:nil];

CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"
                              keysAndValues: kCIInputImageKey, beginImage,
                    @"inputIntensity", @0.8, nil];
CIImage *outputImage = [filter outputImage];

// 2
CGImageRef cgimg =
  [context createCGImage:outputImage fromRect:[outputImage extent]];

// 3
UIImage *newImage = [UIImage imageWithCGImage:cgimg];
self.imageView.image = newImage;

// 4
CGImageRelease(cgimg);

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

  1. 在这部分代码中,你创建了CIContext对象。CIContext 构造函数的输入是一个NSDictionary。 它规定了各种选项,包括颜色格式以及内容是否应该运行在CPU或是GPU上。对于这个应用程序,默认值是可以用的。所以你只需要传入nil作为参数就好了。
  2. 在这里你用上下文对象里的一个方法来画一个CGImage。 调用上下文中的createCGImage:fromRect:和提供的CIImage可以生成一个CGImageRef。
  3. 下面,你用UIImage + imageWithCGImage,从CGImage中创建一个UIImage。
  4. 最后,开放 CGImageRef接口。 CGImage 是一个C接口,即使有ARC,也需要你自己来做内存管理。

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

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

时间: 2024-10-17 07:12:45

CoreImage 及滤镜效果的相关文章

[Swift通天遁地]八、媒体与动画-(4)给相机添加CoreImage滤镜效果

本文将演示如何给相机添加实时的滤镜效果. 首先打开项目的配置文件[Info.plist],在空白区域点击鼠标右键,弹出右键菜单. 选择[Add Row]添加行命令,添加一行配置选项. 在[Key]键输入框输入相机的访问标识:[Application Category] 在[Value]值输入框输入当应用程序访问相机设备时的提示语: [Requires access to the camera] 在左侧的项目导航区,打开视图控制器的代码文件[ViewController.swift] 现在开始编写

CoreImage 可以用滤镜来处理图片,比如修改饱和度,亮度,对比度等

// //  ViewController.m //  UI-CoreImage // //  Created by Bruce on 15/5/22. //  Copyright (c) 2015年 Bruce. All rights reserved. // /*  CoreImage 可以用滤镜来处理图片,比如修改饱和度,亮度,对比度等  它利用GPU(或者CPU,取决于客户)来非常快速.甚至实时地处理图像数据和视频的帧.多个Core Image滤镜可以叠加在一起,从而可以一次性地产生多重

iOS滤镜 和 ios6中的CoreImage技术

Core Image是一个很强大的框架. 它可以让你简单地应用各种滤镜来处理图像,比如修改鲜艳程度, 色泽, 或者曝光. 它利用GPU(或者CPU,取决于客户)来非常快速.甚至实时地处理图像数据和视频的帧. 多个Core Image滤镜可以叠加在一起,从而可以一次性地产生多重滤镜效果.这种多重滤镜的优点在于它可以生成一个改进的滤镜,从而一次性的处理图像达到目标效果,而不是对同一个图像顺序地多次应用单个滤镜.每一个滤镜都有属于它自己的参数.这些参数和滤镜信息,比如功能.输入参数等都可以通过程序来查

[Xcode10 实际操作]六、媒体与动画-(5)使用CoreImage框架给图片添加马赛克效果

本文将演示如何使用CoreImage图像处理框架,给图片添加像素化的滤镜效果. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 1 import UIKit 2 //首先导入要使用的框架,该框架提供了强大和高效的图像处理功能, 3 //用来对基于像素的图像进行分析.操作和特效处理 4 import CoreImage 5 6 class ViewController: UIViewController { 7 8 override func viewDidLo

IOS 中的CoreImage框架(framework)

http://www.cnblogs.com/try2do-neo/p/3601546.html coreimage framework 组成 apple 已经帮我们把image的处理分类好,来看看它的结构: 主要分为三部分: 1)定义部分:CoreImage 何CoreImageDefines.见名思义,代表了CoreImage 这个框架和它的定义. 2)操作部分: 滤镜(CIFliter):CIFilter 产生一个CIImage.典型的,接受一到多的图片作为输入,经过一些过滤操作,产生指定

iOS --- 通过CPU实现的简单滤镜效果

iOS中使用CPU实现滤镜效果的原理很简单, 即将图片转换成像素数据, 然后对每一个像素进行相应的滤镜效果计算, 然后重新得到过滤后的图片. CPU滤镜效果代码如下: 头文件 // CPUImageFilterUtil.h #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import <OpenGLES/ES1/gl.h> #import <OpenGLES/ES1/glext.h> //

C# (GDI+相关) 图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)

原文:C# (GDI+相关) 图像处理(各种旋转.改变大小.柔化.锐化.雾化.底片.浮雕.黑白.滤镜效果) C#图像处理   (各种旋转.改变大小.柔化.锐化.雾化.底片.浮雕.黑白.滤镜效果)     一.各种旋转.改变大小   注意:先要添加画图相关的using引用.   //向右旋转图像90°代码如下: private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) {   Graphics g

网页设计中的彩色滤镜效果

网页设计中的彩色滤镜效果 在当今这个充斥着先进的特效和精妙风格的世界中,谁曾料到,像纯色和渐变这样简单的手法,竟能够催化出创造力,并极大提升网站的美学水准?现代网页设计师们,证明了优雅的插画.精致的图形和壮丽的照片,都能在彩色滤镜效果下很自然地得到强调.气氛焕然一新,网站开始变得光彩夺目.的确,它有助于解决某些问题. 首先,彩色滤镜能给网站耳目一新的外观,却不会增加负担 .其次,它通过搭配传递各种情绪的色彩,很好地丰富了设计.第三,作为一层低透明度的遮罩,它不会掩盖主背景的魅力,对于想要轻微淡化

CoreImage的使用及常见滤镜工具(一)

概述: CoreImage是一个图像框架,它基于OpenGL顶层创建,底层则用着色器来处理图像,这意味着它利用了GPU基于硬件加速来处理图像.CoreImage中有很多滤镜,它们能够一次给予一张图像或者视频帧多种视觉效果.而且滤镜可以连接起来组成一个滤镜链,把滤镜效果叠加起来处理图像. CoreImage框架最早出现于iOS5,iOS6也对这个框架进行了扩展,这篇博客的Demo是基于iOS7的. CoreImage框架最常用的类: * CIImage 保存图像数据的类,可以通过UIImage,图