Quartz 2D编程指南 (十二) —— Quartz 2D中的数据管理(一)

版本记录

版本号 时间
V1.0 2018.09.06

前言

Quartz 2D框架相信大家都知道,也都一直在使用。Quartz 2D的API是纯C语言的,它是一个二维绘图引擎,同时支持iOS和Mac系统。Quartz 2D的API来自于Core Graphics框架,数据类型和函数基本都以CG作为前缀,接下来几篇我们就一起来看一下这个框架。感兴趣可以看上面几篇文章。
1. Quartz 2D编程指南 (一) —— 简介(一)
2. Quartz 2D编程指南 (二) —— Quartz 2D概览(二)
3. Quartz 2D编程指南 (三) —— 图形上下文(三)
4. Quartz 2D编程指南 (四) —— Paths路径(一)
5. Quartz 2D编程指南 (五) —— Paths路径(二)
6. Quartz 2D编程指南 (六) —— 颜色和颜色空间(一)
7. Quartz 2D编程指南 (七) —— 变换(一)
8. Quartz 2D编程指南 (八) —— Patterns图案样式(一)
9. Quartz 2D编程指南 (九) —— 阴影(一)
10. Quartz 2D编程指南 (十) —— 渐变(一)
11. Quartz 2D编程指南 (十一) —— 透明层(一)

Data Management in Quartz 2D - Quartz 2D中的数据管理

管理数据是每个图形应用程序需要执行的任务。对于Quartz,数据管理是指向Quartz 2D例程提供数据或从Quartz 2D例程接收数据。一些Quartz 2D例程将数据移动到Quartz中,例如从文件或应用程序的其他部分获取图像或PDF数据的那些。其他例程接受Quartz数据,例如将图像或PDF数据写入文件或将数据提供给应用程序的其他部分的数据。

Quartz提供了各种用于管理数据的函数。通过阅读本章,您应该能够确定哪种函数最适合您的应用。

注意:读取和写入图像数据的首选方法是使用Image I / O框架,该框架可在iOS 4Mac OS X 10.4及更高版本中使用。有关CGImageSourceRefCGImageDestinationRef不透明数据类型的更多信息,请参见Image I/O Programming Guide。图像源和目标不仅提供对图像数据的访问,还为访问图像元数据提供更好的支持。

Quartz认可三大类数据源和目的地:

  • URL。可以将其位置指定为URL的数据可以充当数据的供应者或接收者。使用Core Foundation数据类型CFURLRef将URL传递给Quartz函数。
  • CFDataCore Foundation数据类型CFDataRefCFMutableDataRef是允许简单分配的缓冲区采用Core Foundation对象行为的数据对象。 CFData与其Cocoa Foundation对应的NSData类是“自由桥接”;如果你在Cocoa框架中使用Quartz 2D,你可以将NSData对象传递给任何带有CFData对象的Quartz函数。
  • Raw data。您可以提供指向任何类型数据的指针以及一组负责数据基本内存管理的回调。

无论是由URL,CFData对象还是数据缓冲区表示的数据本身都可以是图像数据或PDF数据。图像数据可以使用任何类型的文件格式。 Quartz了解大多数常见的图像文件格式。一些Quartz数据管理功能专门用于图像数据,一些仅用于PDF数据,而另一些则更通用,可用于PDF或图像数据。

URLCFData和原始数据源和目标是指Mac OS X或iOS图形技术领域之外的数据,如图10-1所示。 Mac OS X或iOS中的其他图形技术通常提供与Quartz通信的自己的例程。例如,Mac OS X应用程序可以将Quartz图像发送到Core Image,并使用它来改变具有复杂效果的图像。

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

Moving Data into Quartz 2D - 将数据移动到Quartz 2D中

表10-1列出了从数据源获取数据的函数。除了CGPDFDocumentCreateWithURL之外,所有这些函数都返回图像源(CGImageSourceRef)或数据提供者(CGDataProviderRef)。图像源和数据提供程序抽象数据访问任务,并消除了应用程序通过原始内存缓冲区管理数据的需要。

图像源是将图像数据移动到Quartz的首选方式。图像源表示各种各样的图像数据。图像源可以包含多个图像,缩略图图像以及每个图像和图像文件的属性。拥有CGImageSourceRef后,您可以完成以下任务:

函数CGPDFDocumentCreateWithURL是一个便捷函数,它从位于指定URL的文件创建PDF文档。

数据提供程序是一种功能有限的旧机制。它们可用于获取图像或PDF数据。

您可以提供数据提供者:

有关图像的更多信息,请参阅Bitmap Images and Image Masks

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

Function Use this function
CGImageSourceCreateWithDataProvider To create an image source from a data provider.
CGImageSourceCreateWithData To create an image source from a CFData object.
CGImageSourceCreateWithURL To create an image source from a URL that specifies the location of image data.
CGPDFDocumentCreateWithURL To create a PDF document from data that resides at the specified URL.
CGDataProviderCreateSequential To read image or PDF data in a stream. You supply callbacks to handle the data.
CGDataProviderCreateDirectAccess To read image or PDF data in a block. You supply callbacks to handle the data.
CGDataProviderCreateWithData To read a buffer of image or PDF data supplied by your application. You provide a callback to release the memory you allocated for the data.
CGDataProviderCreateWithURL Whenever you can supply a URL that specifies the target for data access to image or PDF data.
CGDataProviderCreateWithCFData To read image or PDF data from a CFData object.

Moving Data out of Quartz 2D - 将数据移出Quartz 2D

表10-2中列出的函数将数据移出Quartz 2D。除CGPDFContextCreateWithURL外,所有这些函数都返回图像目标(CGImageDestinationRef)或数据使用者(CGDataConsumerRef)。图像目标和数据使用者抽象数据写入任务,让Quartz为您处理细节。

图像目标是将图像数据移出Quartz的首选方法。与图像源类似,图像目的地可以表示各种图像数据,从单个图像到包含多个图像的目的地,缩略图图像以及每个图像或图像文件的属性。拥有CGImageDestinationRef后,您可以完成以下任务:

函数CGPDFContextCreateWithURL是一种便捷函数,它将PDF数据写入URL指定的位置。

数据使用者是一种功能有限的旧机制。它们用于写入图像或PDF数据。您可以将数据使用者提供给:

注意:为了在处理原始图像数据时获得最佳性能,请使用vImage框架。 您可以使用vImageBuffer_InitWithCGImage函数从CGImageRef引用将图像数据导入vImage。 有关详细信息,请参阅Accelerate Release Notes

有关图像的更多信息,请参阅Bitmap Images and Image Masks

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

Function Use this function
CGImageDestinationCreateWithDataConsumer To write image data to a data consumer.
CGImageDestinationCreateWithData To write image data to a CFData object.
CGImageDestinationCreateWithURL Whenever you can supply a URL that specifies where to write the image data.
CGPDFContextCreateWithURL Whenever you can supply a URL that specifies where to write PDF data.
CGDataConsumerCreateWithURL Whenever you can supply a URL that specifies where to write the image or PDF data.
CGDataConsumerCreateWithCFData To write image or PDF data to a CFData object.
CGDataConsumerCreate To write image or PDF data using callbacks you supply.

Moving Data Between Quartz 2D and Core Image in Mac OS X - 在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滤镜应用于图像之前,必须将Quartz图像转换为Core Image图像。

Quartz 2D API不提供将Quartz图像打包为Core Image图像的任何函数,但Core Image可以。以下Core Image方法从Quartz图像或Quartz图层(CGLayerRef)创建Core Image图像。您可以使用它们将Quartz 2D数据移动到Core Image。

以下Core Image方法从Core Image图像返回Quartz图像。 您可以使用它们将处理后的图像移回Quartz 2D:

有关Core Image方法的完整说明,请参阅Core Image Reference Collection

后记

本篇主要讲述了数据管理,感兴趣给个赞或者关注下~~

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

推荐阅读更多精彩内容