管理数据是每一个图形应用程序所需要处理的工作。对于
Quartz
来说,数据管理涉及为
Quartz 2D
程序提供数据,及从中获取数据。一些
Quartz 2D
程序将数据传输到
Quartz
中,如从文件或程序其它部分获取图片或
PDF
数据。另一些程序则获取
Quartz
数据,如将图像或
PDF
数据写入到文件,或提供给程序其它部分这些数据。
Quartz 提供了一系列的函数来管理数据。通过学习本章,我们可以了解到哪些函数是最适合我们的程序的。
注:我们推荐使用图像 I/O 框架来读取和写入数据,该框架在 iOS 4 、 Mac OS X 10.4 或者更高版本中可用。查看《 Image I/OProgramming Guide 》可以获取更多关于 CGImageSourceRef 和 CGImageDestinationRef 的信息。图像源和目标不仅提供了访问图像数据的方法,不提供了更多访问图像原数据的方法。
Quartz 可识别三种类型的数据源和目标:
l URL :通过 URL 指定的数据可以作为数据的提供者和接收者。我们使用 Core Foundation 数据类型 CFURLRef 作为参数传递给 Quartz 函数。
l CFData : Core Foundation 数据类型 CFDataRef 和 CFMutableDataRef 可简化 Core Foundation 对象的内存分配行为。 CFData 是一个 ”toll-freebridged” 类, CocoaFoundation 中对应的类是 NSData ;如果在 Quartz 2D 中使用 Cocoa 框架,你可以传递一个 NSData 对象给 Quartz 方法,以取代 CFData 对象。
l 原始数据:我们可以提供一个指向任何类型数据的指针,连同处理这些数据基本内存管理的回调函数集合。
这些数据,无论是 URL 、 CFData 对象,还是数据缓存,都可以是图像数据或 PDF 数据。图像数据可以是任何格式的数据。 Quartz 能够解析大部分常用的图像文件格式。一些 Quartz 数据管理函数专门用于处理图像数据,一些只处理 PDF 数据,还有一些可同时处理 PDF 和图像数据。
URL , CFData 和原始数据源和目标中的数据都是在 Mac OS X 或者 iOS 图像领域范围之外的,如图 10-1 所示。 Mac OS X 或 iOS 的其它图像技术通常会提供它们自己的方式来和 Quartz 通信。例如,一个 Mac OS X 应用程序可以传输一个 Quartz 图像给 Core Image ,并使用 Core Image 来实现更复杂的效果。
传输数据给Quartz 2D
表 10-1 列出了从数据源获取数据的方法。所有的这些函数,除了 CGPDFDocumentCreateWithURL ,都返回一个图像源 (CGImageSourceRef) 或者数据提供者 (CGDataProviderRef) 。图像源和数据提供者抽象了数据访问工作,并避免了程序去管理原始内存缓存。
图像源是将图像数据传输给 Quartz 的首先方式。图像源可表示很多种图像数据。一个图像源可表示多于一个图像,也可表示缩略图、图像的属性和图像文件。当我们拥有 CGImageSourceRef 对象后,我们可以完成如下工作:
l 使用函数 CGImageSourceCreateImageAtIndex,CGImageSourceCreateThumbnailAtIndex, CGImageSourceCreateIncremental 创建图像 (CGImageRef). 一个 CGImageRef 数据类型表示一个单独的 Quartz 图像。
l 通过函数 CGImageSourceUpdateData 或 CGImageSourceUpdateDataProvider 来添加内容到图像源中。
l 使用函数 CGImageSourceGetCount, CGImageSourceCopyProperties 和 CGImageSourceCopyTypeIdentifiers 获取图像源的信息。
CFPDFDocumentCreateWithURL 函数可以方便地从 URL 指定的文件创建 PDF 文档。
数据提供者是比较老的机制,它有很多限制。它们可用于获取图像或 PDF 数据。
我们可以将数据提供者用于:
l 一个图像创建函数,如 CGImageCreate,CGImageCreateWithPNGDataProvider 或者 CGImageCreateWithJPEGDataProvider 。
l PDF 文档的创建函数 CGPDFDocumentCreateWithProvider.
l 函数 CGImageSourceUpdateDataProvider 用于更新已存在的图像源。
关于图像的更多信息,可查看“ Bitmap Images andImage Masks ”。
获取Quartz 2D的数据
表 10-2 列出地从 Quartz 2D 中获取数据的方法。所有这些方法,除了 CGPDFContextCreateWithURL ,都返回一个图像目标 (CGImageDestinationRef) 或者是数据消费者 (CGDataComsumerRef) 。图像目标和数据消费者抽象的数据写入工作,让 Quartz 来处理细节。
一个图像目标是获取 Quartz 数据的首先方法。与图像源一样,图像目标也可以表示很多图像数据,如一个单独图片、多个图片、缩略图、图像属性或者图片文件。在获取到 CGImageDestinationRef 后,我们可以完成以下工作:
l 使用函数 CGImageDestinationAddImage 或者 CGImageDestinationAddImageFromSource 添加一个图像 (CGImageRef) 到目标中。一个 CGImageRef 表示一个图片。
l 使用函数 CGImageDestinationSetProperties 设置属性
l 使用函数 CGImageDestinationCopyTypeIdentifiers 和 CGImageDestinationGetTypeID 从图像目标中获取信息。
函数 CGPDFContextCreateWithURL 可以方便地将 PDF 数据写入 URL 指定的位置。
数据消费者是一种老的机制,有很多限制。它们用于写图像或 PDF 数据。我们可以将数据消费者用于:
l PDF 上下文创建函数 CGPDFContextCreate 。该函数返回一个图形上下文,用于记录一系列的 PDF 绘制命令。
l 函数 CGImageDestinationCreateWithDataConsumer ,用于从数据消费者中创建图像目标。
关于图像的更多信息,可查看“ Bitmap Images andImage Masks ”。
Quartz 提供了一系列的函数来管理数据。通过学习本章,我们可以了解到哪些函数是最适合我们的程序的。
注:我们推荐使用图像 I/O 框架来读取和写入数据,该框架在 iOS 4 、 Mac OS X 10.4 或者更高版本中可用。查看《 Image I/OProgramming Guide 》可以获取更多关于 CGImageSourceRef 和 CGImageDestinationRef 的信息。图像源和目标不仅提供了访问图像数据的方法,不提供了更多访问图像原数据的方法。
Quartz 可识别三种类型的数据源和目标:
l URL :通过 URL 指定的数据可以作为数据的提供者和接收者。我们使用 Core Foundation 数据类型 CFURLRef 作为参数传递给 Quartz 函数。
l CFData : Core Foundation 数据类型 CFDataRef 和 CFMutableDataRef 可简化 Core Foundation 对象的内存分配行为。 CFData 是一个 ”toll-freebridged” 类, CocoaFoundation 中对应的类是 NSData ;如果在 Quartz 2D 中使用 Cocoa 框架,你可以传递一个 NSData 对象给 Quartz 方法,以取代 CFData 对象。
l 原始数据:我们可以提供一个指向任何类型数据的指针,连同处理这些数据基本内存管理的回调函数集合。
这些数据,无论是 URL 、 CFData 对象,还是数据缓存,都可以是图像数据或 PDF 数据。图像数据可以是任何格式的数据。 Quartz 能够解析大部分常用的图像文件格式。一些 Quartz 数据管理函数专门用于处理图像数据,一些只处理 PDF 数据,还有一些可同时处理 PDF 和图像数据。
URL , CFData 和原始数据源和目标中的数据都是在 Mac OS X 或者 iOS 图像领域范围之外的,如图 10-1 所示。 Mac OS X 或 iOS 的其它图像技术通常会提供它们自己的方式来和 Quartz 通信。例如,一个 Mac OS X 应用程序可以传输一个 Quartz 图像给 Core Image ,并使用 Core Image 来实现更复杂的效果。
传输数据给Quartz 2D
表 10-1 列出了从数据源获取数据的方法。所有的这些函数,除了 CGPDFDocumentCreateWithURL ,都返回一个图像源 (CGImageSourceRef) 或者数据提供者 (CGDataProviderRef) 。图像源和数据提供者抽象了数据访问工作,并避免了程序去管理原始内存缓存。
图像源是将图像数据传输给 Quartz 的首先方式。图像源可表示很多种图像数据。一个图像源可表示多于一个图像,也可表示缩略图、图像的属性和图像文件。当我们拥有 CGImageSourceRef 对象后,我们可以完成如下工作:
l 使用函数 CGImageSourceCreateImageAtIndex,CGImageSourceCreateThumbnailAtIndex, CGImageSourceCreateIncremental 创建图像 (CGImageRef). 一个 CGImageRef 数据类型表示一个单独的 Quartz 图像。
l 通过函数 CGImageSourceUpdateData 或 CGImageSourceUpdateDataProvider 来添加内容到图像源中。
l 使用函数 CGImageSourceGetCount, CGImageSourceCopyProperties 和 CGImageSourceCopyTypeIdentifiers 获取图像源的信息。
CFPDFDocumentCreateWithURL 函数可以方便地从 URL 指定的文件创建 PDF 文档。
数据提供者是比较老的机制,它有很多限制。它们可用于获取图像或 PDF 数据。
我们可以将数据提供者用于:
l 一个图像创建函数,如 CGImageCreate,CGImageCreateWithPNGDataProvider 或者 CGImageCreateWithJPEGDataProvider 。
l PDF 文档的创建函数 CGPDFDocumentCreateWithProvider.
l 函数 CGImageSourceUpdateDataProvider 用于更新已存在的图像源。
关于图像的更多信息,可查看“ Bitmap Images andImage Masks ”。
获取Quartz 2D的数据
表 10-2 列出地从 Quartz 2D 中获取数据的方法。所有这些方法,除了 CGPDFContextCreateWithURL ,都返回一个图像目标 (CGImageDestinationRef) 或者是数据消费者 (CGDataComsumerRef) 。图像目标和数据消费者抽象的数据写入工作,让 Quartz 来处理细节。
一个图像目标是获取 Quartz 数据的首先方法。与图像源一样,图像目标也可以表示很多图像数据,如一个单独图片、多个图片、缩略图、图像属性或者图片文件。在获取到 CGImageDestinationRef 后,我们可以完成以下工作:
l 使用函数 CGImageDestinationAddImage 或者 CGImageDestinationAddImageFromSource 添加一个图像 (CGImageRef) 到目标中。一个 CGImageRef 表示一个图片。
l 使用函数 CGImageDestinationSetProperties 设置属性
l 使用函数 CGImageDestinationCopyTypeIdentifiers 和 CGImageDestinationGetTypeID 从图像目标中获取信息。
函数 CGPDFContextCreateWithURL 可以方便地将 PDF 数据写入 URL 指定的位置。
数据消费者是一种老的机制,有很多限制。它们用于写图像或 PDF 数据。我们可以将数据消费者用于:
l PDF 上下文创建函数 CGPDFContextCreate 。该函数返回一个图形上下文,用于记录一系列的 PDF 绘制命令。
l 函数 CGImageDestinationCreateWithDataConsumer ,用于从数据消费者中创建图像目标。
关于图像的更多信息,可查看“ Bitmap Images andImage Masks ”。
图片:Figure 10-1 Moving data to and from Quartz 2D in Mac OS X.png
![](http://cc.cocimg.com/bbs/attachment/thumb/Fid_6/6_38018_e6538c40cc80bbe.png)
图片:Table 10-1 Functions that move data into Quartz 2D.png
![](http://cc.cocimg.com/bbs/attachment/thumb/Fid_6/6_38018_23d72ec7c568bf5.png)
图片:Table 10-2 Functions that move data out of Quartz 2D.png
![](http://cc.cocimg.com/bbs/attachment/thumb/Fid_6/6_38018_ad38140dfa05446.png)