Quartz 2D编程指南之十:Quartz 2D中的数据管理

本文转载自:http://southpeak.github.io/2014/12/11/quartz2d-10/

管理数据是每一个图形应用程序所需要处理的工作。对于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可识别三种类型的数据源和目标:

URL:通过URL指定的数据可以作为数据的提供者和接收者。我们使用Core Foundation数据类型CFURLRef作为参数传递给Quartz函数。

CFData:Core Foundation数据类型CFDataRef和CFMutableDataRef可简化Core Foundation对象的内存分配行为。CFData是一个”toll-freebridged”类,CocoaFoundation中对应的类是NSData;如果在Quartz 2D中使用Cocoa框架,你可以传递一个NSData对象给Quartz方法,以取代CFData对象。

原始数据:我们可以提供一个指向任何类型数据的指针,连同处理这些数据基本内存管理的回调函数集合。

这些数据,无论是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来实现更复杂的效果。

Figure 10-1 Moving data to and from Quartz 2D in Mac OS X

传输数据给Quartz 2D

表10-1列出了从数据源获取数据的方法。所有的这些函数,除了CGPDFDocumentCreateWithURL,都返回一个图像源(CGImageSourceRef)或者数据提供者(CGDataProviderRef)。图像源和数据提供者抽象了数据访问工作,并避免了程序去管理原始内存缓存。

图像源是将图像数据传输给Quartz的首先方式。图像源可表示很多种图像数据。一个图像源可表示多于一个图像,也可表示缩略图、图像的属性和图像文件。当我们拥有CGImageSourceRef对象后,我们可以完成如下工作:

使用函数CGImageSourceCreateImageAtIndex,CGImageSourceCreateThumbnailAtIndex, CGImageSourceCreateIncremental创建图像(CGImageRef). 一个CGImageRef数据类型表示一个单独的Quartz图像。

通过函数CGImageSourceUpdateData或CGImageSourceUpdateDataProvider来添加内容到图像源中。

使用函数CGImageSourceGetCount, CGImageSourceCopyProperties和CGImageSourceCopyTypeIdentifiers获取图像源的信息。

CFPDFDocumentCreateWithURL函数可以方便地从URL指定的文件创建PDF文档。

数据提供者是比较老的机制,它有很多限制。它们可用于获取图像或PDF数据。

我们可以将数据提供者用于:

一个图像创建函数,如CGImageCreate,CGImageCreateWithPNGDataProvider或者CGImageCreateWithJPEGDataProvider。

PDF文档的创建函数CGPDFDocumentCreateWithProvider.

函数CGImageSourceUpdateDataProvider用于更新已存在的图像源。

关于图像的更多信息,可查看“Bitmap Images andImage Masks”。

Table 10-1 Functions that move data into Quartz 2D

获取Quartz 2D的数据

表10-2列出地从Quartz 2D中获取数据的方法。所有这些方法,除了CGPDFContextCreateWithURL,都返回一个图像目标(CGImageDestinationRef)或者是数据消费者(CGDataComsumerRef)。图像目标和数据消费者抽象的数据写入工作,让Quartz来处理细节。

一个图像目标是获取Quartz数据的首先方法。与图像源一样,图像目标也可以表示很多图像数据,如一个单独图片、多个图片、缩略图、图像属性或者图片文件。在获取到CGImageDestinationRef后,我们可以完成以下工作:

使用函数CGImageDestinationAddImage或者CGImageDestinationAddImageFromSource添加一个图像(CGImageRef)到目标中。一个CGImageRef表示一个图片。

使用函数CGImageDestinationSetProperties设置属性

使用函数CGImageDestinationCopyTypeIdentifiers和CGImageDestinationGetTypeID从图像目标中获取信息。

函数CGPDFContextCreateWithURL可以方便地将PDF数据写入URL指定的位置。

数据消费者是一种老的机制,有很多限制。它们用于写图像或PDF数据。我们可以将数据消费者用于:

PDF上下文创建函数CGPDFContextCreate。该函数返回一个图形上下文,用于记录一系列的PDF绘制命令。

函数CGImageDestinationCreateWithDataConsumer,用于从数据消费者中创建图像目标。

关于图像的更多信息,可查看“Bitmap Images andImage Masks”。

Table 10-2 Functions that move data out of Quartz 2D

https://github.com/southpeak/Blog-images/blob/master/quartz-2d-table10-2.png?raw=true

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

推荐阅读更多精彩内容