Data Management in Quartz 2D

管理數(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ù)的功能。 通過閱讀本章,您應(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ù)的訪問,而且還為訪問圖像元數(shù)據(jù)提供更好的支持。

Quartz可以識(shí)別三大類數(shù)據(jù)源和目標(biāo):

  1. URL。 可以將其位置指定為URL的數(shù)據(jù)可以充當(dāng)數(shù)據(jù)的提供者或接收者。 您使用Core Foundation數(shù)據(jù)類型CFURLRef將URL傳遞給Quartz函數(shù)。
  2. 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ì)象。
  3. Raw data。 您可以提供任何類型的數(shù)據(jù)的指針以及一組回調(diào),以處理數(shù)據(jù)的基本內(nèi)存管理。

數(shù)據(jù)本身,無論是由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,并使用它來改變具有復(fù)雜效果的圖像。

10-1 在Mac OS X中將數(shù)據(jù)移入和移出Quartz 2D

將數(shù)據(jù)移入到Quartz 2D

從數(shù)據(jù)源獲取數(shù)據(jù)的功能如表10-1所示。 所有這些函數(shù),除了CGPDFDocumentCreateWithURL,都返回一個(gè)圖像源(CGImageSourceRef)或數(shù)據(jù)提供者(CGDataProviderRef)。 圖像源和數(shù)據(jù)提供者提取數(shù)據(jù)訪問任務(wù),并消除了應(yīng)用程序通過原始內(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)參閱位圖圖像和圖像掩碼

將數(shù)據(jù)移動(dòng)到Quartz 2D的函數(shù)

從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ā)行說明。

有關(guān)圖像的詳細(xì)信息,請(qǐng)參閱位圖圖像和圖像掩碼。

將數(shù)據(jù)移出Quartz 2D的函數(shù)

在Mac OS X中在Quartz 2D和Core Image之間移動(dòng)數(shù)據(jù)

Core Image框架是一個(gè)在Mac OS X中提供的支持圖像處理的Objective-C API。 Core Image允許您訪問視頻和靜態(tài)圖像的內(nèi)置圖像過濾器,并支持自定義過濾器和近實(shí)時(shí)處理。您可以將Core Image過濾器應(yīng)用于Quartz 2D圖像。例如,您可以使用Core Image來更正顏色,扭曲圖像的幾何形狀,模糊或銳化圖像,以及創(chuàng)建圖像之間的過渡。 Core Image還允許對(duì)圖像應(yīng)用迭代過程 - 將濾波器操作的輸出反饋到輸入。要更全面地了解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過濾器應(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方法的完整說明,請(qǐng)參閱Core Image Reference Collection。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容