美文网首页
Quartz 2D编程

Quartz 2D编程

作者: 阿咿呀嘿 | 来源:发表于2015-04-20 20:57 被阅读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

    相关文章

      网友评论

          本文标题:Quartz 2D编程

          本文链接:https://www.haomeiwen.com/subject/yhqufttx.html