Data Management in Quartz 2D

管理数据是每个图形应用程序需要执行的任务。 对于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可以识别三大类数据源和目标:

  1. URL。 可以将其位置指定为URL的数据可以充当数据的提供者或接收者。 您使用Core Foundation数据类型CFURLRef将URL传递给Quartz函数。
  2. CFData。 Core Foundation数据类型CFDataRef和CFMutableDataRef是数据对象,使简单分配的缓冲区具有Core Foundation对象的行为。 CFData是与其Cocoa Foundation对应的NSData类的“免费桥接”; 如果你使用Quartz 2D与Cocoa框架,你可以传递一个NSData对象到任何Quartz函数,接受一个CFData对象。
  3. 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,并使用它来改变具有复杂效果的图像。

10-1 在Mac OS X中将数据移入和移出Quartz 2D

将数据移入到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的函数

从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。 有关详细信息,请参阅加速发行说明。

有关图像的详细信息,请参阅位图图像和图像掩码。

将数据移出Quartz 2D的函数

在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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容