管理数据是每个图形应用程序需要执行的任务。 对于Quartz,数据管理是指向Quartz 2D例程提供数据或从Quartz 2D例程接收数据。 一些Quartz 2D例程将数据移动到Quartz,例如从文件或应用程序的另一部分获取图像或PDF数据的那些。 其他例程接受Quartz数据,例如将图像或PDF数据写入文件或将数据提供给应用程序的另一部分的数据。
Quartz提供了多种管理数据的功能。 通过阅读本章,您应该能够确定哪些函数最适合您的应用程序。
注读取和写入图像数据的首选方法是使用Image I / O框架,该框架在iOS 4和Mac OS X 10.4及更高版本中可用。 有关CGImageSourceRef和CGImageDestinationRef opaque数据类型的更多信息,请参阅Image I / O编程指南。 图像源和目的地不仅提供对图像数据的访问,而且还为访问图像元数据提供更好的支持。
Quartz可以识别三大类数据源和目标:
- URL。 可以将其位置指定为URL的数据可以充当数据的提供者或接收者。 您使用Core Foundation数据类型CFURLRef将URL传递给Quartz函数。
- CFData。 Core Foundation数据类型CFDataRef和CFMutableDataRef是数据对象,使简单分配的缓冲区具有Core Foundation对象的行为。 CFData是与其Cocoa Foundation对应的NSData类的“免费桥接”; 如果你使用Quartz 2D与Cocoa框架,你可以传递一个NSData对象到任何Quartz函数,接受一个CFData对象。
- Raw data。 您可以提供任何类型的数据的指针以及一组回调,以处理数据的基本内存管理。
数据本身,无论是由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,并使用它来改变具有复杂效果的图像。
将数据移入到Quartz 2D
从数据源获取数据的功能如表10-1所示。 所有这些函数,除了CGPDFDocumentCreateWithURL,都返回一个图像源(CGImageSourceRef)或数据提供者(CGDataProviderRef)。 图像源和数据提供者提取数据访问任务,并消除了应用程序通过原始内存缓冲区管理数据的需要。
图像源是将图像数据移动到Quartz的首选方法。 图像源表示各种各样的图像数据。 图像源可以包含多个图像,缩略图图像和每个图像和图像文件的属性。 在你有一个CGImageSourceRef之后,你可以完成这些任务:
- 使用函数CGImageSourceCreateImageAtIndex,CGImageSourceCreateThumbnailAtIndex或CGImageSourceCreateIncremental创建图像(CGImageRef)。 CGImageRef数据类型表示单个Quartz图像。
- 使用函数CGImageSourceUpdateData或CGImageSourceUpdateDataProvider将内容添加到图像源。
- 使用函数CGImageSourceGetCount,CGImageSourceCopyProperties和CGImageSourceCopyTypeIdentifiers从图像源获取信息。
函数CGPDFDocumentCreateWithURL是一个方便的函数,它从位于指定URL的文件创建一个PDF文档。
数据提供者是具有更有限功能的旧机制。 它们可以用于获取图像或PDF数据。
您可以向数据提供者提供:
- 图像创建功能,如CGImageCreate,CGImageCreateWithPNGDataProvider或CGImageCreateWithJPEGDataProvider。
- PDF文档创建函数CGPDFDocumentCreateWithProvider。
- 函数CGImageSourceUpdateDataProvider用新数据更新现有图像源。
有关图像的详细信息,请参阅位图图像和图像掩码
从Quartz 2D移出数据
表10-2中列出的函数将数据移出Quartz 2D。所有这些函数,除了CGPDFContextCreateWithURL,都返回一个图像目的地(CGImageDestinationRef)或数据消费者(CGDataConsumerRef)。图像目标和数据消费者抽象数据写入任务,让Quartz为您处理细节。
图像目标是将图像数据移出Quartz的首选方法。与图像源类似,图像目的地可表示从单个图像到目的地的各种图像数据,其包含每个图像或图像文件的多个图像,缩略图图像和属性。当你有一个CGImageDestinationRef后,你可以完成这些任务:
- 使用函数CGImageDestinationAddImage或CGImageDestinationAddImageFromSource将图像(CGImageRef)添加到目标。 CGImageRef数据类型表示单个Quartz图像。
- 使用函数CGImageDestinationSetProperties设置属性。
- 使用函数CGImageDestinationCopyTypeIdentifiers或CGImageDestinationGetTypeID从映像目标获取信息。
函数CGPDFContextCreateWithURL是一个方便的函数,用于将PDF数据写入URL指定的位置。
数据消费者是具有更有限功能的旧机制。它们用于写入图像或PDF数据。您可以为数据使用者提供:
- PDF上下文创建函数CGPDFContextCreate。此函数返回一个图形上下文,将图形记录为传递到数据使用者对象的一系列PDF绘图命令。
- 函数CGImageDestinationCreateWithDataConsumer从数据消费者创建映像目标。
注:为了在使用原始图像数据时获得最佳性能,请使用vImage框架。 您可以使用vImageBuffer_InitWithCGImage函数将图像数据从CGImageRef引用导入vImage。 有关详细信息,请参阅加速发行说明。
有关图像的详细信息,请参阅位图图像和图像掩码。
在Mac OS X中在Quartz 2D和Core Image之间移动数据
Core Image框架是一个在Mac OS X中提供的支持图像处理的Objective-C API。 Core Image允许您访问视频和静态图像的内置图像过滤器,并支持自定义过滤器和近实时处理。您可以将Core Image过滤器应用于Quartz 2D图像。例如,您可以使用Core Image来更正颜色,扭曲图像的几何形状,模糊或锐化图像,以及创建图像之间的过渡。 Core Image还允许对图像应用迭代过程 - 将滤波器操作的输出反馈到输入。要更全面地了解Core Image的功能,请参阅Core Image Programming Guide。
Core Image方法对打包为Core Image图像或CIImage对象的图像进行操作。 Core Image不直接对Quartz图像(CGImageRef数据类型)进行操作。在将Core Image过滤器应用于图像之前,必须将石英图像转换为Core Image图像。
Quartz 2D API不提供将Quartz图像封装为Core Image图像的任何函数,而是Core Image。以下Core Image方法从Quartz图像或Quartz图层(CGLayerRef)创建Core Image图像。您可以使用它们将Quartz 2D数据移动到Core Image。
- imageWithCGImage:
- imageWithCGImage:options:
- imageWithCGLayer:
- imageWithCGLayer:options:
以下Core Image方法从Core Image图像返回Quartz图像。您可以使用它们将处理的图像移回Quartz 2D:
- createCGImage:fromRect:
- createCGLayerWithSize:info:
有关Core Image方法的完整说明,请参阅Core Image Reference Collection。