Quartz 2D概述

             在Mac OS X中,Quartz 2D可以处理所有的图形和图形技术---Core Image,Core Video,OpenGL,QuickTime。可以使用QuickTime GraphicsImportCreateCGImage函数创建一个图形通过QucikTime Framework 的入口。有关详细信息,可以参照QuickTime Framework的引用。在Mac OS X上在Quartz 2D 和 Core Image 交换数据形象描述了如何为Core Image提供图像。(这是一个框架,支持图像处理)。

            同样,在iOS中,Quartz 2D 可以使用所有可用的图形和动画技术,如核心动画,OpenGL ES,和UIKit 类;

概述里主要介绍:

     1.       The Page(页面)

     2.      Graphics States 图形状态

     3.       Quartz 2D Opaque Data Types Quartz 2D 不透明  数据类型

     4.       Quartz 2D Coordinate Systems  坐标系统

     5.        Memory Management: Object Ownership  内存管理对象所有权

          The Page(页面)

          Quartz 2D 在成像过程中使用了绘画模型,在绘画模型中,每一个连续的绘图操作适用于layer 层的绘制到画布的输出,这经常被称作画布。额外的绘图操作可以覆盖原有页面上的绘图。这个模型允许你从一个小数量的强大的原语构造非常复杂的图像。

   图1-1显示了 绘图模型是如果工作的, 上面的图中后来的固体形状覆盖了第一个图,只留下了边界。下满的图 后面的形状在固体形状中得以保留。所以画图的顺序是很重要的。

Quartz 2D概述_第1张图片

页面可能是一个真正的纸(如果输出设备是一台打印机);这可能是一个虚拟的纸(如果输出设备是一个PDF文件),甚至可能是一个位图图像。页面的确切性质取决于您所使用的特定的图形上下文。   

Drawing Destinations: The Graphics Context 绘制的目的地:图形上下文

  图形上下文是一个不透明的数据类型(CGContextRef)这个数据类型封装了使用Quartz 2D输出到设备上的信息,比如PDF文件,位图,或在显示窗口。图形上下文的信息包含了图形绘制参数和特定的设备展示在绘制页面上。Quartz 2D 里的所有对象都被绘制包括图形上下文。

你可以把一个图形上下文想象为一个绘图目标,如图1-2所示。当您使用Quartz 2D时,所有的设备特定的特性都包含在您使用的特定类型的图形上下文中。换言之,你可以通过提供一个不同的图形上下文来绘制相同的图像到一个不同的设备相同的顺序的Quartz 2D绘图程序。您不需要执行任何设备特定的计算,Quartz 2D为您做的。


Quartz 2D概述_第2张图片

          这些图形上下文都可以在你的应用程序中用到:

      Abitmap graphics context 位图图形上下文允许你绘制RGB、CMYK颜色或灰度图转化为位图。位图是一个像素的矩形阵列(或光栅),每一个像素代表一个图像中的一个点。位图图像也被称为采样图像。请参考Creating a Bitmap Graphics Context。 

    一个PDF图形上下文允许你创建一个PDF文件。在一个PDF文件,你画的图保存为一个命令序列。有PDF文件和位图的一些显着的差异 :  

       PDF文件,不像位图,可以包含多个页面。

      当你画一个页面在不同的设备上的PDF文件,得到的图像是该设备的显示特性优化。

      PDF文件本质上是分辨率独立的,被绘制的大小可以无限增加或者减少,而不用牺牲图像细节。位图图像的用户感知质量与位图的被浏览的分辨率联系在一起。请参考Creating a PDF Graphics Context。

      一个窗口图形上下文是一个图形上下文,可以用来绘制一个窗口。请注意,因为石英是一个图形引擎,而不是一个窗口管理系统,你使用的应用程序框架之一来获得一个窗口的图形上下文。SeeCreating a Window Graphics Context in Mac OS Xfor details.

        A layer context (CGLayerRef)    层的上下文是一个离屏绘制与另一个图形上下文相关的目的地。当你把layer 绘制到它所创建的上下文的时候,性能是最佳的。对于离屏绘制来说,layer congtext 比起位图上下文来说是个更好地选择。SeeCore Graphics Layer Drawing。

        当你想在Mac OS X 上打印时,你把内容发送给PostScript graphics context(被打印框架管理)。SeeObtaining a Graphics Context for Printingfor more information。

    Quartz 2D Opaque Data Types Quartz 2D 不透明  数据类型

        Quartz 2D 除了定义图像上下文之外还定义了各种不透明的数据类型。应为API是  CoreGraphics框架的一部分,数据类型和操作例程都使用CG前缀。

         Quartz 2D根据我们需要操作的数据类型进行创建,已实现一个特性的绘图输出。

         图1-3显示了你可以实现的结果当你应用绘图操作三个Quartz 2D对象的情况:

                (1):你可以旋转,通过创建一个PDF页面对象显示PDF页面,应用旋转操作的图形上下文,并要求Quartz 2D绘制页面图形上下文。

                (2):可以通过创建一个模式对象来绘制模式,定义构成模式的形状,并在绘制图形上下文时设置一个用于绘制图形的Quartz 2D图形。

                (3) :您可以通过创建一个阴影对象(提供了决定阴影中每个点的颜色的方法)来填充一个轴向或径向的阴影区域,然后要求阴影对象作为填充颜色。

 

Quartz 2D概述_第3张图片

     Quartz 2D  中可用的不透明的数据类型有一下几种 :

        CGPathRef : 用来创建你填充或者描边的矢量图形;SeePaths.

         CGImageRef:  用来表示位图图像和基于你提供的样本数据的位图掩模。SeeBitmap Images and Image Masks.。

    CGLayerRef:用来表示一个图层,可用于重复绘制(如背景或模式)和离屏绘制。SeeCore Graphics Layer Drawing;

  CGPatternRef:用于重复绘制,SeePatterns.

CGShadingRef and CGGradientRef:用来绘制渐变,SeeGradients.

CGFunctionRef:用于定义回调函数,以浮点任意参数。当您创建渐变的阴影时,您使用此数据类型。SeeGradients.

CGColorRef and CGColorSpaceRef:用来告知Quartz 2D如何解析颜色。SeeColor and Color Spaces.

CGImageSourceRef and CGImageDestinationRef:你可以用它来将数据移入和移出Quartz 2D。在Quartz 2D和图像I / O编程指南中看到数据管理。SeeData Management in Quartz 2DandImage I/O Programming Guide.

CGFontRef:用于绘制文本;SeeText.

CGPDFDictionaryRef, CGPDFObjectRef, CGPDFPageRef, CGPDFStream, CGPDFStringRef, and CGPDFArrayRef:它提供了访问PDF元数据,SeePDF Document Creation, Viewing, and Transforming.

CGPDFScannerRef and CGPDFContentStreamRef:解析PDF元数据,SeePDF Document Parsing

CGPSConverterRef:在iOS不可用,SeePostScript Conversion.

Graphics States 图形状态

         Quartz 2D修改绘图操作的结果根据当前图形状态的参数。图形状态包含参数,否则被视为绘图程序的参数。例程比如画一个图形上下文需要参考图形状态来决定如何渲染他们的结果。例如,当你调用一个函数来设置填充颜色,你修改的值存储在当前图形状态,所以得参考当天图形状态。其他常用元素的当前图形状态包括线宽、当前位置、文本字体大小。

         图形上下文包含一个图形状态的堆栈,当你创建图形上下文时,堆栈 是空的,当你保存图形状态时,Quartz把当前图形状态拷贝一份并且推到栈顶上。当你恢复图形状态时,Quartz 把图形状态推出栈顶,推出的状态成为当前的图形状态;

        保存当前的图形状态,使用方法CGContextSaveGState,拷贝一份当前图形状态并且推到栈上。为了恢复之前保存的图形状态,使用方法CGContextRestoreGState用栈顶的图形状态替换当前的图形状态。

      请注意,不是当前绘图环境的所有方面都是图形状态的元素。例如,当前的路径是不被认为是图形状态的一部分,因此也没有保存当你调用函数CGContextSaveGState的时候。当你调用这个函数的时候能够被保存的参数在下列的列表中:

 

Quartz 2D概述_第4张图片


Quartz 2D Coordinate Systems   坐标系统

一个坐标系,图1-4所示,定义了用于表示位置和大小的物体被绘制在页面上的位置范围。您指定在用户空间坐标系中的图形的位置和大小,或者,更简单地说,用户空间。坐标被定义为浮点值。

Quartz 2D概述_第5张图片

由于不同的设备有不同的底层成像能力,图形的位置和大小必须以设备无关的方式定义。例如,一个屏幕显示设备可能能够显示不超过96像素每英寸,而一台打印机可能是能够显示每英寸300像素。如果您在设备级定义坐标系统(在这个例子中,或者96像素或300像素),在该空间中绘制的对象不能被复制在其他设备上而没有可见的失真。他们会显得太大或太小。

Quartz完成设备独立性通过一个分离开来的坐标系统----用户空间 ---映射到输出设备的坐标系统---设备空间---采用当前的变换矩阵,或者CTM。矩阵是一个数学结构,用来有效地描述一组相关的方程组当前变换矩阵是一种特殊类型的矩阵,称为仿射变换,它映射点从一个坐标空间到另一个通过应用平移,旋转和缩放操作(计算,移动,旋转,调整坐标系统)。

当前的变换矩阵有一个次要目的:它允许你在绘制对象的时候进行旋转。例如,画一个旋转45°的框的时候,在画框之前旋转了当前页面的坐标系统,Quartz在输出设备上使用的就是旋转后的坐标系。

在用户空间中的一个点表示的坐标对(X,Y),其中X代表沿水平轴(左和右)和Y的位置和Y代表垂直轴(上下)。用户坐标空间的原点是(0,0)的点。原点坐落在页面的左下角,如图1-4所示。Quartz默认的坐标系统,在页面中,它从左到右的X轴增加在Y轴的增加值从底部向顶部。

一些技术使用不同的默认坐标系统来设置他们的图形上下文,而不是Quartz默认的坐标系统。相对于Quartz,这样的坐标系统是一个修改的坐标系,在执行一些绘图操作必须进行补偿。最常见的修改坐标系统是 左上角是原点,沿着y轴指向页面底部。一些地方,你可能会看到这个特定的坐标系统使用的是:

          1°:在Mac OS X中,一个NSView的重写了它的isFlipper方法并且返回YES的子类的时候。

          2°:iOS中,由一个UIView返回的绘图上下文。

          3°:iOS中,绘图上下文调用UIGraphicsBeginImageContextWithOptions函数创建。

  为什么UIKit框架修改了坐标系统是因为UIKit使用不同的默认坐标习惯。它转换了Quartz的坐标系统使之能够匹配自己的习惯。假如你的应用需要使用相同的绘图程序绘制一个UIView和一个PDF图形上下文(它通过Quartz创建,使用的是默认的坐标系统),你需要转换PDF上下文的坐标系统和UIView 的坐标系统一样。为此,你需要转换PDF上下文的坐标原点到左上角和y轴的方向。                        

使用缩放变化否定了在Quartz绘图时y坐标的改变。举个例子,在你调用CGContextDrawImage绘制的时候,当绘制在目的地的时候图片被转换。同样的,路径绘制例程接受一些参数,这些参数指定了一个圆弧在默认的坐标系统是顺时针还是逆时针。假如一个坐标系统被修改,他的结果也被修改,就像一个图片反射在镜子里。图1-5,传递相同的参数,一个是逆时针默认的坐标系,一个是顺时针的转换后的坐标系。


Quartz 2D概述_第6张图片

       它是取决于你的应用程序来调整Quartz调用上下文,这些上下文已经做了调整。例如,如果 你想要一个图形或者PDF画出准确的上下文,您的应用程序也许需要临时调整图形上下文的CTM(当前矩阵转换)。在iOS中,你使用图片对象包裹你创建的CGImage对象,你不需要修改CTM,通过UIKit框架,图片对象会自动为即将修改的坐标系统补偿。

     Important:在你计划直接利用Quartz在iOS 上写程序的时候以上讨论是很容易理解的,但这远远不够,在iOS 3.2以后当你创建上下文的时候,还是有额外的变化要去匹配UIKit默认的惯例。尤其是,模式和阴影,它们并不被CTM影响,需要单独调整来匹配UIKit的坐标系统。这种情况下,CTM就没有等效的机制使你用Quartz创建的上下文能够匹配操作UIKit的行为。你的应用程序必须认识到哪一种被绘制的上下文需要调整从而达到符合上下文的期望。

Memory Management: Object Ownership  内存管理对象所有权

Quar采用引用计数管理内存。创建时,引用计数为1,可以通过调用函数来增加引用计数,以及通过调用函数来释放引用计数来释放对象。当引用计数减为0,对象被释放。该模型允许对象安全地共享对其他对象的引用。

有几个简单的规则要记住:

     1° : 创建或者拷贝对象,当你使用完后必须释放掉,否则会造成内存泄漏。

    2°: 假如你不曾拥有一个对象,可是想持有他的属性。你必须retain 和release它在使用完之后。在Quartz中有指定的方法去持有一个对象和释放一个对象。比如,当你引用了一个CGColorspace对象,你需要使用CGColorSpaceRetain and CGColorSpaceRelease持有它,并且在需要的时候释放掉。你也可以用Core Foundation 的方法: CFRetain and CFRelease。但是你一定要特别小心不要传递NULL给这些方法。

你可能感兴趣的:(Quartz 2D概述)