iOS图形处理概论 OpenGL

一、界面图形框架-UIKit

二、核心动画框架 - Core Animation

三、苹果封装的图形框架 - Core Graphics  &  Quartz 2D

四、传统夸平台图形框架 - OpenGL ES

五、苹果最新力推的图形框架-Metal

六、适合图片的苹果滤镜框架 - Core Image

七、适合视频的第三方滤镜方案 - GPUImage

八、游戏引擎 - Scene Kit(3D)和Sprite Kit(2D)

九、计算机视觉在iOS的应用 - OpenCV for iOS

一、界面图形框架-UIKit

UIKit 是一组OC API,为线条图形,Quartz图像和颜色操作提供OC封装,并提供2D绘制,图像处理及用户接口级别的动画。UIKit包括UIBezierPath(绘制线、角度、椭圆及其它图形)、UIimage(显示图像)、UIcollor(颜色操作)、UIfont和UIScreen(提供字体和屏幕信息)等类似及在位图图形环境,PDF图形环境上进行绘制和操作的功能等,也提供对标准视图的支持,页提供对打印功能的支持。UIKit与Core Graphics的关系:在UIKit中,UIView类本身在绘制时自动创建一个图形环境,即Core Graphics层的CGContext类型,作为当前的图形绘制环境。在绘制时可以调用UIGraphicsGetCurrentContext 函数获得当前的图形环境:

-(void)drawRect:(CGRect)rect{

//1获取上下文

CGContextRef contextRef = UIGraphicsGetCurrentContext();

//2描述路径

UIBezierPath *path = [UIBezierPath bezierPath];

//起点

[path moveToPoint:CGPointMake(10,10)];

//终点

[path addLineToPoint:CGPointMake(100,100)];

//设置颜色

[[UIColor whiteColor] setStroke];

//3添加路径

CGContextAddPath(contextRef,path.CGPath);

//显示路径

CGContextStrokePath(contextRef);

}

二、核心动画框架 - Core Animation

Core Animation 是一套OC API,实现了一个高性能的符合引擎,并提供一个简单易用的编程接口,给用户UI添加平滑运动和动态反馈能力。Core Animation 是UIKit实现动画和变换的基础,也负责视图的复合功能。使用Core Animation 可以实现定制动画和细粒度的动画控制,创建复杂的支持动画和变换的layer 2D视图。Core Animation不属于绘制系统,,但它是以硬件复合和操作显⽰内容的基础设施。这个基础设施的核⼼是layer对象,⽤来管理和操作显⽰内容。在 iOS 中 每⼀个视图都对应Core Animation的⼀个层对象,与视图⼀样,层之间也组织为层关系树。⼀个层捕获视图内容为⼀个被图像硬件容易操作的位图。在多数应⽤中层作为管理视图的⽅式使⽤,但也可以创建独⽴的层到⼀个层关系树中来显⽰视图不够⽀持的显⽰内容。OpenGL ES的内容也可以与Core Animation内容进⾏集成。为了使⽤Core Animation实现动画,可以修改 层的属性值来触发⼀个action对象的执⾏,不同的action对象实现不同的动画。

Core Animatio相关基类及⼦类

Core Animation 提供了⼀下⼀组应⽤可以采⽤的类来提供对不同动画类型的⽀持:

CAAnimation是⼀个抽象公共基类,CAAnimation采⽤CAMediaTiming 和CAAction协议为动画提供时间(如周期、速度、重复次数等)和action⾏为(启动、停⽌等)。

CAPropertyAnimation是 CAAnimation的抽象⼦类,为动画提供⼀个由⼀个key路径规定的层属性的⽀持;

CABasicAnimation是CAPropertyAnimation的具体⼦类,为⼀个层属性提供简单插⼊能⼒。

CAKeyframeAnimation也是CAPropertyAnimation的具体⼦类,提供key帧动画⽀持。

三、苹果封装的图形框架 - Core Graphics  &  Quartz 2D

Core Graphics

Core Graphics是⼀套C-based API, ⽀持向量图形,线、形状、图案、路径、剃度、位图图像和pdf 内容的绘制。

Quartz 2D

Quartz 2D是Core Graphics中的2D 绘制呈现引擎。Quartz是资源和设备⽆关的,提供路径绘制,anti-aliased呈现,剃度填充图案,图像,透

明绘制和透明层、遮蔽和阴影、颜⾊管理,坐标转换,字体、offscreen呈现、pdf⽂档创建、显⽰和分析等功能。

Quartz 2D能够与所有的图形和动画技术(如Core Animation, OpenGL ES, 和 UIKit 等)⼀起使⽤。

Quartz 2D采⽤paint模式进⾏绘制。

图形环境Context

Quartz 2D中使⽤的图形环境也由⼀个类CGContext表⽰。

在Quartz 2D中可以把⼀个图形环境作为⼀个绘制⽬标。当使⽤Quartz 2D进⾏绘制时,所有设备特定的特性被包含在你使⽤的特定类型的图形

环境中,因此通过给相同的图像操作函数提供不同的图像环境你就能够画相同的图像到不同的设备上,因此做到了图像绘制的设备⽆关性。

图形环境Context是个⽐较抽象的东西,它不仅仅是⼀个可以绘制的图层,还包含为当前图层设置的参数,如阴影,线条粗细,绘制模式等。可

以类⽐成⼀个新建的Photoshop图层以及当前笔触,颜⾊等配置。对于移动平台,有三种常见的图形环境Context:

位图上下⽂(A bitmap graphics context):⼀般⽤于绘制图⽚或者⾃定义控件。View Graphics Context: 由UIView⾃动创建,你重写UIView drawRect⽅法时,你的内容会画在这个上下⽂上。Bitmap Graphics Context: 绘制在该上下⽂的内容会以点阵形式存储在⼀块内存中。简单说,就是为图⽚开辟⼀块内存,然后在⾥⾯画东西,上下⽂帮你把图⽚内存抽象成⼀个Context(图层)了。

PDF上下⽂(A PDF graphics context):⽤于⽣成pdf⽂件。

图层上下⽂(A layer context):⽤于离屏绘制( offscreen drawing)。

Quartz 2D提供的主要类包括:

CGContext:表⽰⼀个图形环境;

CGPath:使⽤向量图形来创建路径,并能够填充和stroke;

CGImage:⽤来表⽰位图;

CGLayer:⽤来表⽰⼀个能够⽤于重复绘制和offscreen绘制的绘制层;

CGPattern:⽤来表⽰Pattern,⽤于重复绘制;

CGShading和 CGGradient:⽤于绘制剃度;

CGColor 和 CGColorSpace;⽤来进⾏颜⾊和颜⾊空间管理;

CGFont, ⽤于绘制⽂本;

CGPDFContentStream、CGPDFScanner、CGPDFPage、CGPDFObject,CGPDFStream, CGPDFString等⽤来进⾏pdf⽂件的创建、解析和显⽰。

四、传统夸平台图形框架 - OpenGL ES

OpenGL ES

OpenGL ES是⼀套多功能开放标准的⽤于嵌⼊系统的C-based的图形库,⽤于2D和3D数据的可视化。OpenGL被设计⽤来转换⼀组图形调⽤功能到底层图形硬件(GPU),由GPU执⾏图形命令,⽤来实现复杂的图形操作和运算,从⽽能够⾼性能、⾼帧率利⽤GPU提供的2D和3D绘制能⼒。

OpenGL ES规范本⾝不定义绘制表⾯和绘制窗⼝,因此ios为了使⽤它必须提供和创建⼀个OpenGL ES 的呈现环境,创建和配置存储绘制命令结果的framebuffer 及创建和配置⼀个或多呈现⽬标。

EAGL

在 iOS中使⽤EAGL提供的EAGLContext类 来实现和提供⼀个呈现环境,⽤来保持OpenGL ES使⽤到的硬件状态。 EAGL是⼀个Objective-C API,提供使OpenGL ES与Core Animation和UIKIT集成的接⼝。在调⽤任何OpenGL ES 功能之前必须⾸先初始化⼀个EAGLContext 对象。每⼀个IOS应⽤的每⼀个线程都有⼀个当前context,在调⽤OpenGL ES函数时,使⽤或改变此context中的状态。EAGLContext 的类⽅法setCurrentContext: ⽤来设置当前线程的当前context。EAGLContext 的类⽅法currentContext 返回当前线程的当前context。在切换相同线程的两个上下⽂之前,必须调⽤glFlush函数来确保先前已提交的命令被提交到图形硬件中。

GLKit

可以采⽤不同的⽅式使⽤OpenGL ES以便呈现OpenGL ES内容到不同的⽬标:GLKit和CAEAGLLayer。为了创建全屏幕的视图或使OpenGL ES内容与UIKit视图集成,可以使⽤GLKit。在使⽤GLKit时,GLKit提供的类GLKView类本⾝实现呈现⽬标及创建和维护⼀个framebuffer。GLKit是⼀组Objective-C 类,为使⽤OpenGL ES 提供⼀个⾯向对象接⼝,⽤来简化OpenGL ES应⽤的开发。

CAEAGLLayer

为了使OpenGL ES内容作为⼀个Core Animation层的部分内容时,可以使⽤CAEAGLLayer 作为呈现⽬标,并需要另外创建framebuffer以及⾃⼰实现和控制整个绘制流程。

GLKit⽀持四个3D应⽤开发的关键领域:

1) GLKView 和GLKViewController类提供⼀个标准的OpenGL ES视图和相关联的呈现循环。GLKView可以作为OpenGL ES内容的呈现⽬标,GLKViewController提供内容呈现的控制和动画。视图管理和维护⼀个framebuffer,应⽤只需在framebuffer进⾏绘画即可。

2)GLKTextureLoader 为应⽤提供从IOS⽀持的各种图像格式的源⾃动加载纹理图像到OpenGL ES 图像环境的⽅式,并能够进⾏适当的转换,并⽀持同步和异步加载⽅式。

3)数学运算库,提供向量、矩阵、四元数的实现和矩阵堆栈操作等OpenGL ES 1.1功能。

4)Effect效果类提供标准的公共着⾊效果的实现。能够配置效果和相关的顶点数据,然后创建和加载适当的着⾊器。GLKit 包括三个可配置着⾊效果类:GLKBaseEffect实现OpenGL ES 1.1规范中的关键的灯光和材料模式, GLKSkyboxEffect提供⼀个skybox效果的实现,GLKReflectionMapEffect 在GLKBaseEffect基础上包括反射映射⽀持。

五、苹果最新力推的图形框架-Metal

Metal框架⽀持GPU硬件加速、⾼级3D图形渲染以及⼤数据并⾏运算。且提供了先进⽽精简的API来确保框架的细粒度(fine-grain),并且在组织架构、程序处理、图形呈现、运算指令以及指令相关数据资源的管理上都⽀持底层控制。其核⼼⽬的是尽可能的减少CPU开销,⽽将运⾏时产⽣的⼤部分负载交由GPU承担编写基于底层图形 API 的渲染引擎时,除了 Metal 以外的其他选择还有 OpenGL 和 OpenGL ES。OpenGL 不仅⽀持包括OSX,Windows,Linux 和 Android 在内的⼏乎所有平台,还有⼤量的教程,书籍和最佳实践指南等资料。⽬前,Metal 的资源⾮常有限,并且仅限于搭载了 64 位处理器的 iPhone 和 iPad。但另外⼀⽅⾯,因为 OpenGL 的限制,其性能与 Metal 相⽐并不占优势,毕竟后者是专门⽤来解决这些问题的。如果想要⼀个 iOS 上⾼性能的并⾏计算库,答案⾮常简单。Metal 是唯⼀的选择。OpenGL 在 iOS 上是私有框架,⽽ Core Image (使⽤了OpenGL) 对这样的任务来说既不够强⼤⼜不够灵活

六、适合图片的苹果滤镜框架 - Core Image

Core Image 是 iOS5 新加⼊到 iOS 平台的⼀个图像处理框架,提供了强⼤⾼效的图像处理功能, ⽤来对基于像素的图像进⾏操作与分析, 内置了很多强⼤的滤镜(Filter) (⽬前数量超过了180种), 这些Filter 提供了各种各样的效果, 并且还可以通过 滤镜链 将各种效果的 Filter叠加起来形成强⼤的⾃定义效果。

⼀个 滤镜 是⼀个对象,有很多输⼊和输出,并执⾏⼀些变换。例如,模糊滤镜可能需要输⼊图像和⼀个模糊半径来产⽣适当的模糊后的输出图像。

⼀个 滤镜链 是⼀个链接在⼀起的滤镜⽹络,使得⼀个滤镜的输出可以是另⼀个滤镜的输⼊。以这种⽅式,可以实现精⼼制作的效果。

iOS8 之后更是⽀持⾃定义 CIFilter,可以定制满⾜业务需求的复杂效果。

Core Image 的 API 主要就是三类:

CIImage 保存图像数据的类,可以通过UIImage,图像⽂件或者像素数据来创建,包括未处理的像素数据。

CIFilter 表⽰应⽤的滤镜,这个框架中对图⽚属性进⾏细节处理的类。它对所有的像素进⾏操作,⽤⼀些键-值设置来决定具体操作的程度。

CIContext 表⽰上下⽂,如 Core Graphics 以及 Core Data 中的上下⽂⽤于处理绘制渲染以及处理托管对象⼀样,Core Image 的上下⽂也是实现对图像处理的具体对象。可以从其中取得图⽚的信息。

Core Image 的另外⼀个优势,就是可以根据需求选择 CPU 或者 GPU 来处理

// 创建基于 CPU 的 CIContext 对象 (默认是基于 GPU,CPU 需要额外设置参数)

context = [CIContext contextWithOptions: [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:kCIContextUseSoftwareRenderer]];

// 创建基于 GPU 的 CIContext 对象

context = [CIContext contextWithOptions: nil];

// 创建基于 GPU 的 CIContext 对象

EAGLContext *eaglctx = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

context = [CIContext contextWithEAGLContext:eaglctx];

七、适合视频的第三方滤镜方案 - GPUImage

GPUImage 优势: 最低⽀持 iOS 4.0,iOS 5.0 之后就⽀持⾃定义滤镜。 在低端机型上,GPUImage 有更好的表现。(这个没⽤真正的设备对

⽐过,GPUImage 的主页上是这么说的) GPUImage 在视频处理上有更好的表现。 GPUImage 的代码完成公开,实现透明。 可以根据⾃⼰的

业务需求,定制更加复杂的管线操作。可定制程度⾼。

八、游戏引擎 - Scene Kit(3D)和Sprite Kit(2D)

对于寻找游戏引擎的开发者来说,Metal 不是最佳选择。苹果官⽅的的 Scene Kit (3D) 和 Sprite Kit (2D) 是更好的选择。这些 API 提供了包括物理模拟在内的更⾼级别的游戏引擎。另外还有功能更全⾯的 3D 引擎,例如 Epic 的 Unreal Engine 或 Unity,⼆者都是跨平台的。使⽤这些引擎,你⽆需直接使⽤ Metal 的API,就可以从 Metal 中获益。

2D渲染 -- SpriteKit

SpriteKit 让开发者可以开发⾼性能、省电节能的 2D 游戏。在 iOS 8 中,新添了多项增强功能,这将使 2D 游戏体验更加精彩。这些新技术有助于使游戏⾓⾊的动作更加⾃然,并让开发者可以更轻松地在游戏中加⼊⼒场、检测碰撞和⽣成新的灯光效果。

3D渲染 -- SceneKit

SceneKit 专为休闲 3D 游戏⽽设计,可让开发者渲染 3D 游戏场景。SceneKit 内置了物理引擎、粒⼦发⽣器和各种易⽤⼯具,可以轻松快捷地为 3D 物体编写动作。不仅如此,它还与 SpriteKit 完全集成,所以开发者可以直接在 3D 游戏中加⼊ SpriteKit 的素材。

九、计算机视觉在iOS的应用 - OpenCV for iOS

OpenCV 的 API 是 C++ 的。它由不同的模块组成,这些模块中包含范围极为⼴泛的各种⽅法,从底层的图像颜⾊空间转换到⾼层的机器学习⼯具。这⾥提供⼀个⼊门PDF⽂档 下载⼊⼝。

使⽤ C++ API 并不是绝⼤多数 iOS 开发者每天都做的事,你需要使⽤ Objective-C++ ⽂件来调⽤ OpenCV 的函数。 也就是说,你不能在Swift 或者 Objective-C 语⾔内调⽤ OpenCV 的函数。 这篇 OpenCV 的 iOS 教程告诉你只要把所有⽤到 OpenCV 的类的⽂件后缀名改为 .mm 就⾏了,包括视图控制器类也是如此。这么⼲或许能⾏得通,却不是什么好主意。正确的⽅式是给所有你要在 app 中使⽤到的 OpenCV 功能写⼀层 Objective-C++ 封装。这些 Objective-C++ 封装把 OpenCV 的 C++ API 转化为安全的 Objective-C API,以⽅便地在所有Objective-C 类中使⽤。⾛封装的路⼦,你的⼯程中就可以只在这些封装中调⽤ C++ 代码,从⽽避免掉很多让⼈头痛的问题,⽐如直接改⽂件后缀名会因为在错误的⽂件中引⽤了⼀个 C++ 头⽂件⽽产⽣难以追踪的编译错误。OpenCV 声明了命名空间 cv,因此 OpenCV 的类的前⾯会有个 vc::前缀,就像 cv::Mat、cv::Algorithm等等。你也可以在 .mm⽂件中使⽤ using namespace cv来避免在⼀堆类名前使⽤ cv::前缀。但是,在某些类名前你必须使⽤命名空间前缀,⽐如 cv::Rect和 cv::Point,因为它们会跟定义在 MacTypes.h中的 Rect 和 Point相冲突。尽管这只是个⼈偏好问题,我还是偏向在任何地⽅都使⽤ cv::以保持⼀致性。

⼀般讲的OpenCV是基于CPU的,相关资料和⽀持也是最完善的。当然,也有基于GPU模块,但提供的接⼝⾮常坑爹,相当⼀部分不⽀持浮点类型(像histogram、integral这类常⽤的都不⽀持);⼜如,遇到阈值判断的地⽅,就必须传回cpu处理,因为gpu函数都是并⾏处理的,每改写完⼀个算法模块,就测试⼀下运⾏效率,有的时候是振奋⼈⼼,有的时候则是当头棒喝——⽐CPU还慢。详情可参阅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值