Quartz 2D编程指南(10) -- Quartz 2D中的数据管理

管理数据是每一个图形应用程序所需要处理的工作。对于 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 ”。


图片:Figure 10-1  Moving data to and from Quartz 2D in Mac OS X.png 
图片:Table 10-1  Functions that move data into Quartz 2D.png 
图片:Table 10-2  Functions that move data out of Quartz 2D.png 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值