Quartz 2D编程

2015-04-20  本文已影响111人  阿咿呀嘿

Quartz 2D编程

四个应用方向:

绘图

应用内图像编辑

创建或显示位图

PDF文档

画布Canvas

页Page

覆盖式绘制,无法修改,绘制次序非常重要

绘图的destination—图像上下文Context

PDF文件

位图bitmap

窗口window

打印机printer

图层Layer

CGContextRef是一种不透明数据类型,包含了Quartz绘制图像至各种Destination的信息,这些信息里边包含绘图参数、设备特征数据。

Quartz 2D 不透明数据类型

API是CoreGraphics框架的一部分,故以CG为前缀

CGPathRef:矢量图形填充或描边的路径

CGImageRef:位图对象

CGLayerRef:图层对象

CGPatternRef:用于重复绘制

CGShadingRef、CGGradientRef:用于绘制梯度

CGFunctionRef:回调函数

CGColorRef、CGColorSpaceRef:用于颜色解析

CGImageSourceRef、CGImageDestinationRef:用于图形数据I/O

CGFontRef:绘制文本时描述字体

CGPDFDictionaryRef、CGPDFObjectRef、CGPDFPageRef、CGPDFStream、CGPDFStringRef、CGPDFArrayRef:用于访问PDF元数据

CGPDFScannerRef、CGPDFContentStreamRef:用于解析PDF元数据

Graphics State

State中保存了绘图所使用的一些参数。

绘图上下文context包含了一个state栈,刚创建context后栈是空的,当调用CGContextSaveGState函数后,当前state的一个副本被push到栈中,当调用CGContextRestoreGState函数后,从栈中pop出一个state作为当前state。

并非所有绘图环境方面都是state的元素,比如当前绘图的path就不是。

state包含的所有绘图参数:

变换:Current Transformation Matrix(CTM)

路径:Clipping area、Line:width,join,cap,dash,miter limit、Accuracy of curve estimation平滑度

上下文:Anti-aliasing setting反锯齿设置

颜色与颜色空间:color fill and stricken setting颜色填充与描边设置、透明度设置transparency、rendering intent渲染意图、color space fill and stricken setting颜色空间填充与描边设置

文本:字体、字体大小、字符间距、文本绘制模式

路径与位图、遮罩:混合模式

Coordinate system坐标系统

坐标系统用于描述图形对象绘制的位置和大小

由于不同设备的成像能力不同,图形绘制的位置和大小必须使用一种与设备无关的方式。Quartz使用一种特殊的坐标系统——用户空间坐标系实现设备无关性,使用当前变换矩阵CTM将用户空间映射到设备空间坐标系统中。当前变换矩阵CTM是一种仿射变换矩阵,通过平移、旋转、缩放操作将用户空间中的点映射到设备空间中。

有些技术使用不同与Quartz的坐标系统配置绘图上下文context,这种坐标系统叫做修正的坐标系统,当执行Quartz绘图操作时,必须调整坐标系统,这种坐标系统用于以下三种情况:

Mac OS XNSView的子类重写isFlipped方法并返回YES

iOS中UIView返回的context

iOS中使用UIGraphicsBeginImageContextWithOptions方法创建的context

内存管理:对象关系

Quartz使用引用计数的CoreFoundation内存管理模型。

谨记以下几点:

如果你创建或拷贝了一个对象,你就拥有这个对象,因此你必须负责是否这个对象。也就是说,如果你通过调用名称包含Create或Copy的函数持有了一个对象,那么你必须在使用对象完成后是否对象,否则会造成内存泄露。

如果你通过调用名称不包含Create或Copy的函数持有了一个对象,那么你并没拥有对象的引用,你就不应该是否它,它会在合适的时机由它的拥有者取释放。

如果你不拥有一个对象,而你又要保留它,那么你应该retain它并在你用完它的时候释放它。比如你可以使用函数CGColorSpaceRetain和CGColorSpaceRelease来retain和释放CGColorSpace对象,你也可以使用CoreFoundation的函数CFRetain和CFRelease,但你必须保证不要传递NULL给这些函数。

Transform变换

当前变换矩阵Current Transformation Matrix,CTM

修改CTM

平移:移动坐标空间的原点位置,比如x方向平移100,y方向平移50:

CGContextTranslateCTM (myContext, 100, 50);

旋转:坐标空间以原点为中心旋转一定角度,比如绕原点旋转-45度:

CGContextRotateCTM (myContext, –45.0*M_PI/180));

缩放:缩放坐标空间的x、y比例,比如x缩放0.5,y缩放0.75:

CGContextScaleCTM (myContext, 0.5, 0.75);

创建仿射变换CGAffineTransform:

创建平移仿射矩阵CGAffineTransformMakeTranslation

平移仿射变换CGAffineTransformTranslate

创建旋转仿射矩阵CGAffineTransformMakeRotation

旋转仿射变换CGAffineTransformRotate

创建缩放仿射矩阵CGAffineTransformMakeScale

缩放仿射变换CGAffineTransformScale

上一篇下一篇

猜你喜欢

热点阅读