iOS5给我们带来了很多很好很强大的功能和API。Core Image就是其中之一,它使我们很容易就能处理图片的各种效果,色彩啊,曝光啊,饱和度啊,变形啊神马的。

可惜苹果一直没能完善官方文档,也没有推出示例代码,所以国内很多同学可能还没有开始使用。
但国外的大神们已经证明这是个相当强悍的框架,不仅功能强大,而且可以直接使用GPU,效率奇高,甚至可以实时的对视频进行渲染。
下面让我们来看看,如何具体使用它:
首先你需要导入 CoreImage.framework 框架;进行Mac(不是iOS)开发的同学请导入 QuartzCore.framework 框架,包含在其中了。

然后我们先来看看3个主要的类:
CIContext:它与Core Graphics 和 OpenGL context类似,所有Core Image的处理流程都通过它来进行;
CIImage:它用来存放图片数据,可以通过UIImage,图片文件或像素数据创建;
CIFilter:通过它来定义过滤器的详细属性。

CIContext有两种初始化方法,分别对应GPU和CPU

1
2
3
4
5
// 创建基于GPU的CIContext对象
context = [CIContext contextWithOptions: nil];
    
// 创建基于CPU的CIContext对象
//context = [CIContext contextWithOptions: [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:kCIContextUseSoftwareRenderer]];

一般采用第一种基于GPU的,因为效率要比CPU高很多,但是要注意的是基于GPU的CIContext对象无法跨应用访问。
比如你打开UIImagePickerController要选张照片进行美化,如果你直接在UIImagePickerControllerDelegate的委托方法里调用CIContext对象进行处理,那么系统会自动将其降为基于CPU的,速度会变慢,所以正确的方法应该是在委托方法里先把照片保存下来,回到主类里再来处理。(代码里你将会看到)

CIImage的初始化方法有很多,常用的也是2种:

1
2
3
4
5
6
7
8
// 通过图片路径创建CIImage
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"];
NSURL *fileNameAndPath = [NSURL fileURLWithPath:filePath];
beginImage = [CIImage imageWithContentsOfURL:fileNameAndPath];
 
// 通过UIImage对象创建CIImage
UIImage *gotImage = ...;
beginImage = [CIImage imageWithCGImage:gotImage.CGImage];

CIFilter初始化:

1
2
3
4
// 创建过滤器
filter = [CIFilter filterWithName:@"CISepiaTone"];
[filter setValue:beginImage forKey:kCIInputImageKey];
[filter setValue:[NSNumber numberWithFloat:slideValue] forKey:@"inputIntensity"];

第一行:指定使用哪一个过滤器,通过[CIFilter filterNamesInCategory: kCICategoryBuiltIn]能得到所有过滤器的列表
第二行:指定需要处理的图片
第三行:指定过滤参数,每个过滤器的参数都不一样,可以在官方文档里搜索“Core Image Filter Reference”查看

得到过滤后的图片并输出:

1
2
3
4
5
CIImage *outputImage = [filter outputImage];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *newImg = [UIImage imageWithCGImage:cgimg];    
[imgV setImage:newImg];
CGImageRelease(cgimg);

第一行:通过[filter outputImage]可以得到过滤器输出的图片
第二行:通过CIContext的方法createCGImage: fromRect:得到CGImage
第三行:转化为UIImage,这样我们就可以跟据需要显示在界面上了

至此一个过滤周期就完成了,简单来说分以下几个步骤:
1 初始化CIContext,CIImage
2 初始化CIFilter并设置参数
3 得到输出的图片
4 将图片转化成能显示的UIImage类型
如果想一张图片有多种过滤效果就需要重复2,3两步,并且要将上一个过滤器输出的图片作为下一个过滤器的参数

简单吧!几行代码就可以得到丰富的效果哦,我在代码里实现了3种效果:
原图:

旧照片:

色彩:

旋转:

示例代码: CoreImage.zip (868 K) 下载次数:1297

小技巧:有同学可能想换张图片试试,但使用模拟器的同学打开图片库时里面是空的吧,你在模拟器里打开Safari,在网上找到你想要的图片,长按会弹出问你要不要保存,选保存后再打开图片库里面就有图片了。

iOS5新特性: Core Image 示例的更多相关文章

  1. Java8 新特性 Streams map() 示例

    在Java 8中stream().map(),您可以将对象转换为其他对象.查看以下示例: 1.大写字符串列表 1.1简单的Java示例将Strings列表转换为大写. TestJava8.java p ...

  2. [转]深入了解 CSS3 新特性

    简介 CSS 即层叠样式表(Cascading Stylesheet).Web 开发中采用 CSS 技术,可以有效地控制页面的布局.字体.颜色.背景和其它效果.只需要一些简单的修改,就可以改变网页的外 ...

  3. Entity Framework Core 2.0 新特性

    本文翻译来自:https://docs.microsoft.com/en-us/ef/core/what-is-new/index 一.模型级查询过滤器(Model-level query filte ...

  4. EF Core 新特性——Owned Entity Types

    Owned Entity Types 首先owned entity type是EF Core 2.0的新特性. 至于什么是owned entity types,可以先把他理解为EF Core官方支持的 ...

  5. [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    [翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...

  6. 尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性

    本文首发于<尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性> 概述 .NET开发者们大家好,我是Rector. 几天前(美国时间2 ...

  7. C# 6新特性及示例代码

    今天推荐的其实是一个Github开源项目,不过这个开源项目是专门介绍C# 6的最新特性,并给出了示例代码. 我们知道,微软即将发布Windows 10和Visual Studio 2015,在VS20 ...

  8. EntityFramework Core 1.1有哪些新特性呢?我们需要知道

    前言 在项目中用到EntityFramework Core都是现学现用,及时发现问题及时测试,私下利用休闲时间也会去学习其他未曾遇到过或者用过的特性,本节我们来讲讲在EntityFramework C ...

  9. asp.net core新特性(1):TagHelper

    进步,才是人应该有的现象.-- 雨果 今天开始,我就来说说asp.net core的新特性,今天就说说TagHelper标签助手.虽然学习.net,最有帮助的就是microsoft的官方说明文档了,里 ...

随机推荐

  1. Xshell连接服务器密钥改成密码登录

    密钥登陆 直接点本地shell打开之后直接ssh ip连接 需要centos用户登录,选择机器密钥. 登录后 sudo su - root 修改root密码 passwd root 修改文件 vi / ...

  2. 简单介绍移动端CSS3单位rem的用法

    PC端大部份是用px单位,小部分用em单位,而移动端,请全部用rem单位吧.目前大部份设备,包括但不限于iOS 5+.Android 2.3+.Window Phone 8+都是可以兼容的,具体兼容表 ...

  3. CreateCompatibleBitmap 需要注意的问题

    不要使用CreateCompatibleDC得到的内存DC作为其参数,应使用真实DC,否则图片不能显示

  4. 解决MySQL 在 Java 检索遇到timestamp空值时报异常的问题

    使用JDBC检索MySQL数据库,如果遇到timestamp字段的值为空,那么会立即报出异常: ### Error querying database.  Cause: java.sql.SQLExc ...

  5. 洛谷-语文成绩-[有奖]洛谷5月月赛:kkksc03的三大神器

    题目背景 Background语文考试结束了,成绩还是一如既往地有问题. 题目描述 Description语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行.她总是要一遍遍地给某些同学增加分数 ...

  6. ios书籍推荐

    1.Objective-C Programming  内容不多, 却都是精华, 有了一点 C 语言基础可以快速阅读此书, 大概一天时间就可以看完, 看完后对 iOS 开发能够有个基本的印象. 2.iO ...

  7. 【Machine Learning in Action --4】朴素贝叶斯分类

    1.概述 朴素贝叶斯分类是贝叶斯分类器的一种,贝叶斯分类算法是统计学的一种分类方法,利用概率统计知识进行分类,其分类原理就是利用贝叶斯公式根据某对象的先验 概率计算出其后验概率(即该对象属于某一类的概 ...

  8. drupal7 开发block

    在自己开发的模块的module文件中,实现两个钩子:hook_block_info()和hook_block_view() function journal_block_info() { $block ...

  9. Asynchronous JS: Callbacks, Listeners, Control Flow Libs and Promises

    非常好的文章,讲javascript 的异步编程的. ------------------------------------------------------------------------- ...

  10. 浅谈 zookeeper 原理,安装和配置

    当前云计算流行, 单一机器额的处理能力已经不能满足我们的需求,不得不采用大量的服务集群.服务集群对外提供服务的过程中,有很多的配置需要随时更新,服务间需要协调工作,那么这些信息如何推送到各个节点?并且 ...