Quartz 2D基本概念

什么是Quartz 2D

  1. Quartz 是一个二维绘图引擎,所以也叫Quartz 2D。为了简单,后面都叫Quartz
  2. Quartz的API是纯C语言的,API来自于Core Graphics

它仅限于二维绘图

Quartz 能做什么

  1. 线条、图形
  2. 透明度
  3. 描影
  4. 绘制阴影
  5. 透明层
  6. 颜色管理
  7. 反锯齿
  8. 文字
  9. 图片
  10. PDF
  11. 截图
  12. 自定义UIView

Page

Quartz 在图像中使用了绘画者模型(painter’s model)。绘画者模型中,每个连续的绘制操作都是将一个绘制层(a layer of ‘paint’)放置于一个画布(‘canvas’),我们通常称这个画布为Page。 与HTML5中Canvas差不多。
Quartz 在图像中使用了绘画者模型(painter’s model)。绘画者模型中,每个连续的绘制操作都是将一个绘制层(a layer of ‘paint’)放置于一个画布(‘canvas’),我们通常称这个画布为Page。 与HTML5中Canvas差不多。
绘制顺序所产生的效果也将会不一样:

painer's model

Page可以是一张纸(如果输出设备是打印机),也可以是虚拟的纸张(如果输出设备是PDF文件),还可以是bitmap图像。这根据实际使用的graphics context而定。

Graphics Context

Graphics Context是一个数据类型(CGContextRef),用于封装Quartz绘制图像到输出设备的信息。设备可以是PDF文件、bitmap或者显示器的窗口上。

painer's model

Quartz提供了以下几种类型的Graphics Context:

  1. Bitmap Graphics Context
  2. PDF Graphics Context
  3. Window Graphics Context
  4. Layer Graphics Context
  5. PostScript graphics context(Printer Graphics Context)

Data Types

除了 Graphics Context 之外,Quartz 2D API还定义一些数据类型。由于这些API就Core Graphics框架的一部分,所以这些数据类型都是以CG开头的。

  1. CGPathRef 用于向量图,可创建路径,并进行填充或描画(stroke)
  2. CGImageRef 用于表示bitmap图像和基于采样数据的bitmap图像遮罩

Graphics State

Quartz通过修改当前图形状态(current graphics state)来修改绘制操作的结果。图形状态包含用于绘制程序的参数。绘制程序根据这些绘图状态来决定如何渲染结果。例如,当你调用设置填充颜色的函数时,你将改变存储在当前绘图状态中的颜色值。

Graphics Context 包含一个绘图状态栈。

  1. 将当前的上下文copy一份,保存到栈顶(那个栈叫做”图形上下文栈”)

    1
    void CGContextSaveGState(CGContextRef c)
  2. 将栈顶的上下文出栈,替换掉当前的上下文

    1
    void CGContextRestoreGState(CGContextRef c)

Coordinate Systems

  1. Quartz中默认的坐标系统是:沿着x轴从左到右坐标值逐渐增大;沿着y轴从下到上坐标值逐渐增大。即原点在右下角。

    The Quartz coordinate system

  2. 而UIKit的坐标系是沿着x轴从左到右坐标值逐渐增大;沿着y轴从下到下坐标值逐渐增大。即原点在左上角。

    The Quartz coordinate system

由于不同的设备有不同的图形功能,所以图像的位置及大小依赖于设备。例如,一个显示设备可能每英寸只能显示少于96个像素,而打印机可能每英寸能显示300个像素。如果在设备级别上定义坐标系统,则在一个设备上绘制的图形无法在其它设备上正常显示。
Quartz通过使用当前转换矩阵(current transformation matrix, CTM)将一个独立的坐标系统(user space)映射到输出设备的坐标系统(device space),以此来解决设备依赖问题。

CTM 矩阵

CTM是一种特殊类型的矩阵(affine transform, 仿射矩阵),通过平移(translation)、旋转(rotation)、缩放(scale)操作将点从一个坐标空间映射到另外一个坐标空间。当然这个也只是2D的。
仿射矩阵 AffineTransform

不同的Graphics Context的使用的是修改后的坐标系统。例如在iOS中,由UIView返回的绘图上下文。

内存管理

  1. 使用含有“Create”或“Copy”的函数创建的对象,使用完后必须释放,否则将导致内存泄露
  2. 使用不含有“Create”或“Copy”的函数获取的对象,则不需要释放
  3. 如果retain了一个对象,不再使用时,需要将其release掉
  4. 可以使用Quartz 的函数来指定retain和release一个对象。例如,如果创建了一个CGColorSpace对象,则使用函数CGColorSpaceRetain和CGColorSpaceRelease来retain和release对象。
  5. 也可以使用Core Foundation的CFRetain和CFRelease。注意不能传递NULL值给这些函数

参考

  1. Quartz 2D Programming Guide
  2. Quartz 2D Programming Guide 中文
坚持原创技术分享,您的支持将鼓励我继续创作!