1. 程式人生 > >iOS實現圖形編程可以使用三種API(UIKIT、Core Graphics、OpenGL ES及GLKit)

iOS實現圖形編程可以使用三種API(UIKIT、Core Graphics、OpenGL ES及GLKit)

圖像處理 運動 esper 之前 類方法 ati ima quartz 環境

這些api包含的繪制操作都在一個圖形環境中進行繪制。一個圖形環境包含繪制參數和所有的繪制需要的設備特定信息,包括屏幕圖形環境、offscreen 位圖環境和PDF圖形環境,用來在屏幕表面、一個位圖或一個pdf文件中進行圖形和圖像繪制。在屏幕圖形環境中進行的繪制限定於在一個UIView類或其子類的實例中繪制,並直接在屏幕顯示,在offscreen位圖或PDF圖形環境中進行的繪制不直接在屏幕上顯示。

一、UIKIT API

UIKIT是一組Objective-C API,為線條圖形、Quartz圖像和顏色操作提供Objective-C 封裝,並提供2D繪制、圖像處理及用戶接口級別的動畫。

UIKIT包括UIBezierPath(繪制線、角度、橢圓及其它圖形)、UIImage(顯示圖像)、UIColor(顏色操作)、UIFont和UIScreen(提供字體和屏幕信息)等類以及在位圖圖形環境、PDF圖形環境上進行繪制和 操作的功能等, 也提供對標準視圖的支持,也提供對打印功能的支持。

在UIKIT中UIView類本身在繪制時自動創建一個圖形環境(對應Core Graphics層的CGContext類型)作為當前的圖形繪制環境。在繪制時可以調用UIGraphicsGetCurrentContext 函數獲得當前的圖形環境。

二、Core Graphics 與Quartz 2D API

Core Graphics是一套C-based API, 支持向量圖形,線、形狀、圖案、路徑、剃度、位圖圖像和pdf 內容的繪制。

Quartz 2D 是Core Graphics中的2D 繪制呈現引擎。Quartz是資源和設備無關的,提供路徑繪制,anti-aliased呈現,剃度填充圖案,圖像,透明繪制和透明層、遮蔽和陰影、顏色管理,坐標轉換,字體、offscreen呈現、pdf文檔創建、顯示和分析等功能。

Quartz 2D能夠與所有的圖形和動畫技術(如Core Animation, OpenGL ES, 和 UIKit 等)一起使用。

Quartz采用paint模式進行繪制。

Quartz 中使用的圖形環境也由一個類CGContext表示。

在Quartz 中可以把一個圖形環境作為一個繪制目標。當使用Quartz 進行繪制時,所有設備特定的特性被包含在你使用的特定類型的圖形環境中,因此通過給相同的圖像操作函數提供不同的圖像環境你就能夠畫相同的圖像到不同的設備上,因此做到了圖像繪制的設備無關性。

Quartz 為應用提供如下幾個圖形環境:

1)位圖圖形環境,用來創建一個位圖。

使用函數CGBitmapContextCreate來創建。

2)PDF圖形環境,用來創建一個pdf文件。

Quartz 2D API提供了兩個函數來創建一個PDF圖形環境:

CGPDFContextCreateWithURL,帶有一個作為pdf 輸出的位置的Core Foundation URL來創建一個pdf 圖形環境。

CGPDFContextCreate, 當想PDF 輸出到一個data consumer時使用該函數。

3) 窗口圖形環境,用來在一個窗口上進行繪制。

4) 層環境(CGLayer) ,是一個與另一個圖形環境關聯的offscreen繪制目標,使用層環境的目的是為了優化繪制層到創建它的圖形環境的性能。層環境能夠比位圖圖形環境提供更好的offscreen繪制性能。

Quartz提供的主要類包括:

CGContext:表示一個圖形環境;

CGPath:使用向量圖形來創建路徑,並能夠填充和stroke;

CGImage:用來表示位圖;

CGLayer:用來表示一個能夠用於重復繪制和offscreen繪制的繪制層;

CGPattern:用來表示Pattern,用於重復繪制;

CGShading和 CGGradient:用於繪制剃度;

CGColor 和 CGColorSpace;用來進行顏色和顏色空間管理;

CGFont, 用於繪制文本;

CGPDFContentStream、CGPDFScanner、CGPDFPage、CGPDFObject,CGPDFStream, CGPDFString等用來進行pdf文件的創建、解析和顯示。

三、OpenGL ES和GLKit

OpenGL ES是一套多功能開放標準的用於嵌入系統的C-based的圖形庫,用於2D和3D數據的可視化。OpenGL被設計用來轉換一組圖形調用功能到底層圖形硬件(GPU),由GPU執行圖形命令,用來實現復雜的圖形操作和運算,從而能夠高性能、高幀率利用GPU提供的2D和3D繪制能力。

OpenGL ES規範本身不定義繪制表面和繪制窗口,因此ios為了使用它必須提供和創建一個OpenGLES 的呈現環境,創建和配置存儲繪制命令結果的framebuffer 及創建和配置一個或多個呈現目標。

在 iOS中使用EAGL提供的EAGLContext類 來實現和提供一個呈現環境,用來保持OpenGLES使用到的硬件狀態。 EAGL是一個Objective-C API,提供使OpenGL ES與Core Animation和UIKIT集成的接口。

在調用任何OpenGLES 功能之前必須首先初始化一個EAGLContext 對象。

每一個iOS應用的每一個線程都有一個當前context,在調用OpenGLES函數時,使用或改變此context中的狀態。

EAGLContext 的類方法setCurrentContext:用來設置當前線程的當前context。EAGLContext 的類方法currentContext 返回當前線程的當前context。在切換相同線程的兩個上下文之前,必須調用glFlush函數來確保先前已提交的命令被提交到圖形硬件中。

可以采用不同的方式使用OpenGL ES以便呈現OpenGL ES內容到不同的目標:GLKit和CAEAGLLayer。

為了創建全屏幕的視圖或使OpenGL ES內容與UIKit視圖集成,可以使用GLKit。在使用GLKit時,GLKit提供的類GLKView類本身實現呈現目標及創建和維護一個framebuffer。

為了使OpenGL ES內容作為一個Core Animation層的部分內容時,可以使用CAEAGLLayer 作為呈現目標,並需要另外創建framebuffer以及自己實現和控制整個繪制流程。

GLKit是一組Objective-C 類,為使用OpenGL ES 提供一個面向對象接口,用來簡化OpenGL ES應用的開發。GLKit支持四個3D應用開發的關鍵領域:

1) GLKView 和GLKViewController類提供一個標準的OpenGLES視圖和相關聯的呈現循環。GLKView可以作為OpenGLES內容的呈現目標,GLKViewController提供內容呈現的控制和動畫。視圖管理和維護一個framebuffer,應用只需在framebuffer進行繪畫即可。

2)GLKTextureLoader 為應用提供從iOS支持的各種圖像格式的源自動加載紋理圖像到OpenGLES 圖像環境的方式,並能夠進行適當的轉換,並支持同步和異步加載方式。

3)數學運算庫,提供向量、矩陣、四元數的實現和矩陣堆棧操作等OpenGL ES 1.1功能。

4)Effect效果類提供標準的公共著色效果的實現。能夠配置效果和相關的頂點數據,然後創建和加載適當的著色器。GLKit 包括三個可配置著色效果類:GLKBaseEffect實現OpenGL ES 1.1規範中的關鍵的燈光和材料模式, GLKSkyboxEffect提供一個skybox效果的實現, GLKReflectionMapEffect 在GLKBaseEffect基礎上包括反射映射支持。

使用GLKView和OpenGLES進行繪制過程:

1)創建一個GLKView 對象

GLKView 對象可以編程或使用Interface Builder來創建和配置。

在采用編程方式時,首先創建一個context然後調用initWithFrame:context:方法。

使用Interface Builder方式時,在從storyboard加載一個GLKView後,創建一個context和設置它作為視圖的context屬性.

在iOS中GLKit的使用需要創建OpenGL ES 2.0以上的圖形環境context。

GLKit視圖自動創建和配置它所有的OpenGLES framebuffer對象和renderbuffers,可以通過修改視圖的drawable屬性來控制這些對象的屬性。

2)繪制OpenGL內容(發布繪制命令)

使用GLKit視圖繪制OpenGL內容需要三個子步驟:準備OpenGLES基礎;發布繪制命令;呈現顯示內容到Core Animation。 GLKit類本身已經實現了第一個和第三個步驟,用戶只需實現第二個步驟,在視圖的方法drawRect或視圖的代理對象的glkView:drawInRect:中調用適當的OpenGLES繪制命令進行內容繪制。

GLKViewController類維護一個animation 呈現循環(包含兩個方法update和display),用來實現連續的動畫復雜的場景。

animation 呈現循環的交替速率由GLKViewController的屬性framesPerSecond 指示,並使用preferredFramesPerSecond 屬性來修改它。

四、其它圖形編程相關API

1)Core Animation

Core Animation是一套Objective-C API,實現了一個高性能的復合引擎,並提供一個簡單易用的編程接口,給用戶UI添加平滑運動和動態反饋能力。

Core Animation 是 UIKit實現動畫和變換的基礎,也負責視圖的復合功能。使用Core Animation可以實現定制動畫和細粒度的動畫控制,創建復雜的、支持動畫和變換的layered 2D視圖。

Core Animation不屬於繪制系統,但它是以硬件復合和操作顯示內容的基礎設施。這個基礎設施的核心是layer對象,用來管理和操作顯示內容。在ios 中每一個視圖都對應Core Animation的一個層對象,與視圖一樣,層之間也組織為層關系樹。一個層捕獲視圖內容為一個被圖像硬件容易操作的位圖。在多數應用中層作為管理視圖的方式使用,但也可以創建獨立的層到一個層關系樹中來顯示視圖不夠支持的顯示內容。

OpenGL ES的內容也可以與Core Animation內容進行集成。

http://blog.sina.com.cn/s/blog_1308b909c0102vzvf.html

iOS實現圖形編程可以使用三種API(UIKIT、Core Graphics、OpenGL ES及GLKit)