管理數(shù)據(jù)是每個(gè)圖形應(yīng)用程序需要執(zhí)行的任務(wù)。 對(duì)于Quartz椅您,數(shù)據(jù)管理是指向Quartz 2D例程提供數(shù)據(jù)或從Quartz 2D例程接收數(shù)據(jù)外冀。 一些Quartz 2D例程將數(shù)據(jù)移動(dòng)到Quartz,例如從文件或應(yīng)用程序的另一部分獲取圖像或PDF數(shù)據(jù)的那些掀泳。 其他例程接受Quartz數(shù)據(jù)雪隧,例如將圖像或PDF數(shù)據(jù)寫入文件或?qū)?shù)據(jù)提供給應(yīng)用程序的另一部分的數(shù)據(jù)。
Quartz提供了多種管理數(shù)據(jù)的功能开伏。 通過(guò)閱讀本章膀跌,您應(yīng)該能夠確定哪些函數(shù)最適合您的應(yīng)用程序。
注讀取和寫入圖像數(shù)據(jù)的首選方法是使用Image I / O框架固灵,該框架在iOS 4和Mac OS X 10.4及更高版本中可用捅伤。 有關(guān)CGImageSourceRef和CGImageDestinationRef opaque數(shù)據(jù)類型的更多信息,請(qǐng)參閱Image I / O編程指南巫玻。 圖像源和目的地不僅提供對(duì)圖像數(shù)據(jù)的訪問(wèn)丛忆,而且還為訪問(wèn)圖像元數(shù)據(jù)提供更好的支持祠汇。
Quartz可以識(shí)別三大類數(shù)據(jù)源和目標(biāo):
- URL。 可以將其位置指定為URL的數(shù)據(jù)可以充當(dāng)數(shù)據(jù)的提供者或接收者熄诡。 您使用Core Foundation數(shù)據(jù)類型CFURLRef將URL傳遞給Quartz函數(shù)可很。
- CFData。 Core Foundation數(shù)據(jù)類型CFDataRef和CFMutableDataRef是數(shù)據(jù)對(duì)象凰浮,使簡(jiǎn)單分配的緩沖區(qū)具有Core Foundation對(duì)象的行為我抠。 CFData是與其Cocoa Foundation對(duì)應(yīng)的NSData類的“免費(fèi)橋接”; 如果你使用Quartz 2D與Cocoa框架,你可以傳遞一個(gè)NSData對(duì)象到任何Quartz函數(shù)袜茧,接受一個(gè)CFData對(duì)象菜拓。
- Raw data。 您可以提供任何類型的數(shù)據(jù)的指針以及一組回調(diào)笛厦,以處理數(shù)據(jù)的基本內(nèi)存管理纳鼎。
數(shù)據(jù)本身,無(wú)論是由URL裳凸,CFData對(duì)象還是數(shù)據(jù)緩沖器表示贱鄙,都可以是圖像數(shù)據(jù)或PDF數(shù)據(jù)。 圖像數(shù)據(jù)可以使用任何類型的文件格式姨谷。 Quartz了解大多數(shù)常見的圖像文件格式逗宁。 一些Quartz數(shù)據(jù)管理功能專門用于圖像數(shù)據(jù),一些僅用于PDF數(shù)據(jù)菠秒,而另一些則更通用疙剑,可用于PDF或圖像數(shù)據(jù)。
URL践叠,CFData和原始數(shù)據(jù)源和目標(biāo)是指Mac OS X或iOS圖形技術(shù)領(lǐng)域以外的數(shù)據(jù),如圖10-1所示嚼蚀。 Mac OS X或iOS中的其他圖形技術(shù)通常提供自己的例程與Quartz通信禁灼。 例如,Mac OS X應(yīng)用程序可以將Quartz圖像發(fā)送到Core Image轿曙,并使用它來(lái)改變具有復(fù)雜效果的圖像弄捕。
將數(shù)據(jù)移入到Quartz 2D
從數(shù)據(jù)源獲取數(shù)據(jù)的功能如表10-1所示。 所有這些函數(shù)导帝,除了CGPDFDocumentCreateWithURL守谓,都返回一個(gè)圖像源(CGImageSourceRef)或數(shù)據(jù)提供者(CGDataProviderRef)。 圖像源和數(shù)據(jù)提供者提取數(shù)據(jù)訪問(wèn)任務(wù)您单,并消除了應(yīng)用程序通過(guò)原始內(nèi)存緩沖區(qū)管理數(shù)據(jù)的需要斋荞。
圖像源是將圖像數(shù)據(jù)移動(dòng)到Quartz的首選方法。 圖像源表示各種各樣的圖像數(shù)據(jù)虐秦。 圖像源可以包含多個(gè)圖像平酿,縮略圖圖像和每個(gè)圖像和圖像文件的屬性凤优。 在你有一個(gè)CGImageSourceRef之后,你可以完成這些任務(wù):
- 使用函數(shù)CGImageSourceCreateImageAtIndex蜈彼,CGImageSourceCreateThumbnailAtIndex或CGImageSourceCreateIncremental創(chuàng)建圖像(CGImageRef)筑辨。 CGImageRef數(shù)據(jù)類型表示單個(gè)Quartz圖像。
- 使用函數(shù)CGImageSourceUpdateData或CGImageSourceUpdateDataProvider將內(nèi)容添加到圖像源幸逆。
- 使用函數(shù)CGImageSourceGetCount棍辕,CGImageSourceCopyProperties和CGImageSourceCopyTypeIdentifiers從圖像源獲取信息。
函數(shù)CGPDFDocumentCreateWithURL是一個(gè)方便的函數(shù)还绘,它從位于指定URL的文件創(chuàng)建一個(gè)PDF文檔楚昭。
數(shù)據(jù)提供者是具有更有限功能的舊機(jī)制。 它們可以用于獲取圖像或PDF數(shù)據(jù)蚕甥。
您可以向數(shù)據(jù)提供者提供:
- 圖像創(chuàng)建功能哪替,如CGImageCreate,CGImageCreateWithPNGDataProvider或CGImageCreateWithJPEGDataProvider菇怀。
- PDF文檔創(chuàng)建函數(shù)CGPDFDocumentCreateWithProvider凭舶。
- 函數(shù)CGImageSourceUpdateDataProvider用新數(shù)據(jù)更新現(xiàn)有圖像源。
有關(guān)圖像的詳細(xì)信息爱沟,請(qǐng)參閱位圖圖像和圖像掩碼
從Quartz 2D移出數(shù)據(jù)
表10-2中列出的函數(shù)將數(shù)據(jù)移出Quartz 2D帅霜。所有這些函數(shù),除了CGPDFContextCreateWithURL呼伸,都返回一個(gè)圖像目的地(CGImageDestinationRef)或數(shù)據(jù)消費(fèi)者(CGDataConsumerRef)身冀。圖像目標(biāo)和數(shù)據(jù)消費(fèi)者抽象數(shù)據(jù)寫入任務(wù),讓Quartz為您處理細(xì)節(jié)括享。
圖像目標(biāo)是將圖像數(shù)據(jù)移出Quartz的首選方法搂根。與圖像源類似,圖像目的地可表示從單個(gè)圖像到目的地的各種圖像數(shù)據(jù)铃辖,其包含每個(gè)圖像或圖像文件的多個(gè)圖像剩愧,縮略圖圖像和屬性。當(dāng)你有一個(gè)CGImageDestinationRef后娇斩,你可以完成這些任務(wù):
- 使用函數(shù)CGImageDestinationAddImage或CGImageDestinationAddImageFromSource將圖像(CGImageRef)添加到目標(biāo)仁卷。 CGImageRef數(shù)據(jù)類型表示單個(gè)Quartz圖像。
- 使用函數(shù)CGImageDestinationSetProperties設(shè)置屬性犬第。
- 使用函數(shù)CGImageDestinationCopyTypeIdentifiers或CGImageDestinationGetTypeID從映像目標(biāo)獲取信息锦积。
函數(shù)CGPDFContextCreateWithURL是一個(gè)方便的函數(shù),用于將PDF數(shù)據(jù)寫入U(xiǎn)RL指定的位置歉嗓。
數(shù)據(jù)消費(fèi)者是具有更有限功能的舊機(jī)制丰介。它們用于寫入圖像或PDF數(shù)據(jù)。您可以為數(shù)據(jù)使用者提供:
- PDF上下文創(chuàng)建函數(shù)CGPDFContextCreate。此函數(shù)返回一個(gè)圖形上下文基矮,將圖形記錄為傳遞到數(shù)據(jù)使用者對(duì)象的一系列PDF繪圖命令淆储。
- 函數(shù)CGImageDestinationCreateWithDataConsumer從數(shù)據(jù)消費(fèi)者創(chuàng)建映像目標(biāo)。
注:為了在使用原始圖像數(shù)據(jù)時(shí)獲得最佳性能家浇,請(qǐng)使用vImage框架本砰。 您可以使用vImageBuffer_InitWithCGImage函數(shù)將圖像數(shù)據(jù)從CGImageRef引用導(dǎo)入vImage。 有關(guān)詳細(xì)信息钢悲,請(qǐng)參閱加速發(fā)行說(shuō)明点额。
有關(guān)圖像的詳細(xì)信息,請(qǐng)參閱位圖圖像和圖像掩碼莺琳。
在Mac OS X中在Quartz 2D和Core Image之間移動(dòng)數(shù)據(jù)
Core Image框架是一個(gè)在Mac OS X中提供的支持圖像處理的Objective-C API还棱。 Core Image允許您訪問(wèn)視頻和靜態(tài)圖像的內(nèi)置圖像過(guò)濾器,并支持自定義過(guò)濾器和近實(shí)時(shí)處理惭等。您可以將Core Image過(guò)濾器應(yīng)用于Quartz 2D圖像珍手。例如,您可以使用Core Image來(lái)更正顏色辞做,扭曲圖像的幾何形狀琳要,模糊或銳化圖像,以及創(chuàng)建圖像之間的過(guò)渡秤茅。 Core Image還允許對(duì)圖像應(yīng)用迭代過(guò)程 - 將濾波器操作的輸出反饋到輸入稚补。要更全面地了解Core Image的功能,請(qǐng)參閱Core Image Programming Guide框喳。
Core Image方法對(duì)打包為Core Image圖像或CIImage對(duì)象的圖像進(jìn)行操作课幕。 Core Image不直接對(duì)Quartz圖像(CGImageRef數(shù)據(jù)類型)進(jìn)行操作。在將Core Image過(guò)濾器應(yīng)用于圖像之前五垮,必須將石英圖像轉(zhuǎn)換為Core Image圖像乍惊。
Quartz 2D API不提供將Quartz圖像封裝為Core Image圖像的任何函數(shù),而是Core Image放仗。以下Core Image方法從Quartz圖像或Quartz圖層(CGLayerRef)創(chuàng)建Core Image圖像污桦。您可以使用它們將Quartz 2D數(shù)據(jù)移動(dòng)到Core Image。
- imageWithCGImage:
- imageWithCGImage:options:
- imageWithCGLayer:
- imageWithCGLayer:options:
以下Core Image方法從Core Image圖像返回Quartz圖像匙监。您可以使用它們將處理的圖像移回Quartz 2D:
- createCGImage:fromRect:
- createCGLayerWithSize:info:
有關(guān)Core Image方法的完整說(shuō)明,請(qǐng)參閱Core Image Reference Collection小作。