CoreGraphic框架解析(一)—— 基本概览

版本记录

版本号 时间
V1.0 2017.08.08

前言

quartz是一个通用的术语,用于描述在iOSMAC OS X 中整个媒体层用到的多种技术 包括图形、动画、音频、适配。Quart 2D 是一组二维绘图和渲染APICore Graphic会使用到这组APIQuartz Core专指Core Animation用到的动画相关的库、API和类。CoreGraphicsUIKit下的主要绘图系统,频繁的用于绘制自定义视图。Core Graphics是高度集成于UIView和其他UIKit部分的。Core Graphics数据结构和函数可以通过前缀CG来识别。在app中很多时候绘图等操作我们要利用CoreGraphic框架,它能绘制字符串、图形、渐变色等等,是一个很强大的工具。下面几篇就主要介绍CoreGraphics这个工具。

框架概览

我们先看一下框架CoreGraphics的组成。

#import <CoreGraphics/CoreGraphics.h>

这个框架包含以下的文件。

#ifndef COREGRAPHICS_H_
#define COREGRAPHICS_H_

#include <CoreGraphics/CGBase.h>

#include <CoreGraphics/CGAffineTransform.h>
#include <CoreGraphics/CGBitmapContext.h>
#include <CoreGraphics/CGColor.h>
#include <CoreGraphics/CGColorConversionInfo.h>
#include <CoreGraphics/CGColorSpace.h>
#include <CoreGraphics/CGContext.h>
#include <CoreGraphics/CGDataConsumer.h>
#include <CoreGraphics/CGDataProvider.h>
#include <CoreGraphics/CGError.h>
#include <CoreGraphics/CGFont.h>
#include <CoreGraphics/CGFunction.h>
#include <CoreGraphics/CGGeometry.h>
#include <CoreGraphics/CGGradient.h>
#include <CoreGraphics/CGImage.h>
#include <CoreGraphics/CGLayer.h>
#include <CoreGraphics/CGPDFArray.h>
#include <CoreGraphics/CGPDFContentStream.h>
#include <CoreGraphics/CGPDFContext.h>
#include <CoreGraphics/CGPDFDictionary.h>
#include <CoreGraphics/CGPDFDocument.h>
#include <CoreGraphics/CGPDFObject.h>
#include <CoreGraphics/CGPDFOperatorTable.h>
#include <CoreGraphics/CGPDFPage.h>
#include <CoreGraphics/CGPDFScanner.h>
#include <CoreGraphics/CGPDFStream.h>
#include <CoreGraphics/CGPDFString.h>
#include <CoreGraphics/CGPath.h>
#include <CoreGraphics/CGPattern.h>
#include <CoreGraphics/CGShading.h>

#endif  /* COREGRAPHICS_H_ */

使用这些文件时必须显式的引用。

#import <CoreGraphics/CoreGraphics.h>

框架的应用

1. 几个应用方向

这个框架主要应用的方向其实就是绘制自定义视图,几个具有代表性的方向:

  • 绘制文字
  • 根据任意路径绘制图像
  • 绘制渐变色
  • 抗锯齿渲染

2. 几个专业术语

还需要注意下面几个专业术语:

  • 路径 path
  • 阴影 shadow
  • 笔画 stroke
  • 剪裁路径 Clip Path
  • 线条粗细 Line Width
  • 混合模式Blend Mode
  • 填充色 Fill Color
  • 当前形变矩阵Current Transform Matrix
  • 线条图案Line Dash

3. 几个重要概念

上下文 Context

这个是绘图中最重要的概念,相当于我们画图的画布,我们可以简单地给Quartz绘图序列指定不同的Graphics Context,就可将相同的图像绘制到不同的设备上。而不需要任何设备相关的计算,这些都由Quartz替我们完成。

我们还可以从下面角度理解上下文。

  • 一个Graphics Context表示一个绘制目标。它包含绘制系统用于完成绘制指令的绘制参数和设备相关信息。
  • Graphics Context定义了基本的绘制属性,如颜色、裁减区域、线条宽度和样式信息、字体信息、混合模式等。
  • iOS应用程序中,如果要在屏幕上进行绘制,需要创建一个UIView对象,并实现它的drawRect:方法。视图的drawRect:方法在视图显示在屏幕上及它的内容需要更新时被调用,通过调用UIGraphicsGetCurrentContext()方法可以获取当前的Graphics Context
  • Quartz2D的坐标系统原点是左下角,UI控件的坐标系统原点是左上角,如果绘图的上下文,是使用UIGraphicsGetCurrentContext或者其他以UI开头的方法获取到的,在绘图时无需进行坐标转换。

主要有下面几种上下文:

  • Bitmap Graphics Context
  • PDF Graphics Context
  • Window Graphics Context
  • Layer Graphics Context
  • Printer Graphics Context

4. 框架架构及原理

下面看一下ios图像处理模块的经典原理配图。

ios图像处理

最上层是UIKit框架,这是服务于Application的最前端框架,封装了所有控件类和操作;在其之下是Core Animation框架,借助与这个框架,Apple向开发人员提供了非常方便的动画处理功能和图像渲染功能。再往下,分离成基于GPU绘图的OpenGL ES层和基于CPU绘图的Core Graphic层。最底层的就是支持最终绘图的硬件平台,包括GPU,CPU,缓存,总线等等。

下面看一下CoreAnimation渲染。

CoreAnimation渲染

这里虽然画着是他们都具有很明显的分隔,但是实际上他们的应用是十分紧密的,可以看一下下面的原理图。

工作原理图

这里可以看见,CPUGPU都可以绘图,不过最终都是送到GPU进行显示了。

CPU和GPU工作关系

下面看几个容易混淆的概念CoreGraphicsQuartzCoreQuartz

  • CoreGraphics.framework

    • Quartz 2D : API manages the graphic context and implements drawing.
    • Quartz Services : API provides low level access to the window server. This includes display hardware, resolution, refresh rate, and others.
  • QuartzCore.framework

    • Core Animation : Objective-C API to do 2D animation.
    • Core Image: image and video processing (filters, warp, transitions).iOS 5
  • Quartz.framework (OS X only)

    • Image Kit: display and edit images.
    • PDF Kit: display and edit PDFs.
    • Quartz Composer: display Quartz Composer compositions.
    • QuickLookUI: preview media elements.
  • 其它一些Quartz技术:

    • Quartz Extreme: GPU acceleration for Quartz Composer.
    • QuartzGL (aka "Quartz 2D Extreme"): GPU acceleration for Quartz 2D.

5. 几个重要的问题

Quartz2D坐标转换

  • CGContextRotateCTM(CGContextRef c, CGFloat angle)方法可以相对原点旋转上下文坐标系。
    -CGContextTranslateCTM(CGContextRef c, CGFloat tx, CGFloat ty)方法可以相对原点平移上下文坐标系。
  • CGContextScaleCTM(CGContextRef c, CGFloat sx, CGFloat sy)方法可以缩放上下文坐标系。

注意:

  • 转换坐标系前,使用CGContextSaveGState(CGContextRef c)保存当前上下文状态。
  • 坐标系转换后,使用CGContextRestoreGState(CGContextRef c)可以恢复之前保存的上下文状态。

drawRect:方法注意事项

  • 是在UIViewControllerloadViewviewDidLoad两方法之后调用的。
  • 如果在UIView初始化时没有设置CGRectdrawRect:将不会被自动调用。
  • 如果设置UIView的contentMode属性值为UIViewContentModeRedraw,那么将在每次更改frame时自动调用drawRect:
  • 如果使用UIView绘图,只能在drawRect:方法中获取相应的CGContextRef并绘图。而在其他方法中获取的CGContextRef不能用于绘图。
  • 重绘时应该调用setNeedsDisplay,而不能直接调用drawRect:setNeedsDisplay会自动调用drawRect:

内存管理问题

  • Quartz2D是C语言的框架,并且部分需要自己管理内存,使用含CreateCopy的函数创建的对象,使用完后必须释放,否则将导致内存泄露。
  • 使用不含有CreateCopy的函数获取的对象,则不需要释放。
  • 如果retain了一个对象,不再使用时,需要将其release掉。可以使用Quartz 2D的函数来指定retain和release一个对象。例如,如果创建了一个CGColorSpace对象,则使用函数CGColorSpaceRetainCGColorSpaceRelease来retain和release对象。也可以使用 Core FoundationCFRetainCFRelease。注意不能传递NULL值给这些函数。

参考文章

1. iOS 2D Graphic(1)—— Concept 基本概念和原理
2. 整理一下CoreGraphic和Quartz2D的知识(一)

后记

未完,待续~~~

秋天
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容