本文轉(zhuǎn)載自:http://southpeak.github.io/2014/12/11/quartz2d-10/
管理數(shù)據(jù)是每一個圖形應(yīng)用程序所需要處理的工作。對于Quartz來說碳胳,數(shù)據(jù)管理涉及為Quartz 2D程序提供數(shù)據(jù)褥符,及從中獲取數(shù)據(jù)蝶棋。一些Quartz 2D程序?qū)?shù)據(jù)傳輸?shù)絈uartz中抢呆,如從文件或程序其它部分獲取圖片或PDF數(shù)據(jù)姐军。另一些程序則獲取Quartz數(shù)據(jù),如將圖像或PDF數(shù)據(jù)寫入到文件问慎,或提供給程序其它部分這些數(shù)據(jù)。
Quartz提供了一系列的函數(shù)來管理數(shù)據(jù)挤茄。通過學(xué)習(xí)本章如叼,我們可以了解到哪些函數(shù)是最適合我們的程序的。
注:我們推薦使用圖像I/O框架來讀取和寫入數(shù)據(jù)穷劈,該框架在iOS 4笼恰、Mac OS X 10.4或者更高版本中可用。查看《Image I/OProgramming Guide 》可以獲取更多關(guān)于CGImageSourceRef和CGImageDestinationRef的信息歇终。圖像源和目標(biāo)不僅提供了訪問圖像數(shù)據(jù)的方法社证,不提供了更多訪問圖像原數(shù)據(jù)的方法。
Quartz可識別三種類型的數(shù)據(jù)源和目標(biāo):
URL:通過URL指定的數(shù)據(jù)可以作為數(shù)據(jù)的提供者和接收者评凝。我們使用Core Foundation數(shù)據(jù)類型CFURLRef作為參數(shù)傳遞給Quartz函數(shù)追葡。
CFData:Core Foundation數(shù)據(jù)類型CFDataRef和CFMutableDataRef可簡化Core Foundation對象的內(nèi)存分配行為。CFData是一個”toll-freebridged”類奕短,CocoaFoundation中對應(yīng)的類是NSData宜肉;如果在Quartz 2D中使用Cocoa框架,你可以傳遞一個NSData對象給Quartz方法翎碑,以取代CFData對象谬返。
原始數(shù)據(jù):我們可以提供一個指向任何類型數(shù)據(jù)的指針,連同處理這些數(shù)據(jù)基本內(nèi)存管理的回調(diào)函數(shù)集合杈女。
這些數(shù)據(jù)朱浴,無論是URL吊圾、CFData對象,還是數(shù)據(jù)緩存翰蠢,都可以是圖像數(shù)據(jù)或PDF數(shù)據(jù)项乒。圖像數(shù)據(jù)可以是任何格式的數(shù)據(jù)。Quartz能夠解析大部分常用的圖像文件格式梁沧。一些Quartz數(shù)據(jù)管理函數(shù)專門用于處理圖像數(shù)據(jù)檀何,一些只處理PDF數(shù)據(jù),還有一些可同時處理PDF和圖像數(shù)據(jù)廷支。
URL频鉴,CFData和原始數(shù)據(jù)源和目標(biāo)中的數(shù)據(jù)都是在Mac OS X 或者iOS圖像領(lǐng)域范圍之外的,如圖10-1所示恋拍。Mac OS X或iOS的其它圖像技術(shù)通常會提供它們自己的方式來和Quartz通信垛孔。例如,一個Mac OS X 應(yīng)用程序可以傳輸一個Quartz圖像給Core Image施敢,并使用Core Image來實現(xiàn)更復(fù)雜的效果周荐。
Figure 10-1 Moving data to and from Quartz 2D in Mac OS X
表10-1列出了從數(shù)據(jù)源獲取數(shù)據(jù)的方法。所有的這些函數(shù)僵娃,除了CGPDFDocumentCreateWithURL概作,都返回一個圖像源(CGImageSourceRef)或者數(shù)據(jù)提供者(CGDataProviderRef)。圖像源和數(shù)據(jù)提供者抽象了數(shù)據(jù)訪問工作默怨,并避免了程序去管理原始內(nèi)存緩存讯榕。
圖像源是將圖像數(shù)據(jù)傳輸給Quartz的首先方式。圖像源可表示很多種圖像數(shù)據(jù)匙睹。一個圖像源可表示多于一個圖像愚屁,也可表示縮略圖、圖像的屬性和圖像文件垃僚。當(dāng)我們擁有CGImageSourceRef對象后集绰,我們可以完成如下工作:
使用函數(shù)CGImageSourceCreateImageAtIndex,CGImageSourceCreateThumbnailAtIndex, CGImageSourceCreateIncremental創(chuàng)建圖像(CGImageRef). 一個CGImageRef數(shù)據(jù)類型表示一個單獨的Quartz圖像。
通過函數(shù)CGImageSourceUpdateData或CGImageSourceUpdateDataProvider來添加內(nèi)容到圖像源中谆棺。
使用函數(shù)CGImageSourceGetCount, CGImageSourceCopyProperties和CGImageSourceCopyTypeIdentifiers獲取圖像源的信息栽燕。
CFPDFDocumentCreateWithURL函數(shù)可以方便地從URL指定的文件創(chuàng)建PDF文檔。
數(shù)據(jù)提供者是比較老的機制改淑,它有很多限制碍岔。它們可用于獲取圖像或PDF數(shù)據(jù)。
我們可以將數(shù)據(jù)提供者用于:
一個圖像創(chuàng)建函數(shù)朵夏,如CGImageCreate,CGImageCreateWithPNGDataProvider或者CGImageCreateWithJPEGDataProvider蔼啦。
PDF文檔的創(chuàng)建函數(shù)CGPDFDocumentCreateWithProvider.
函數(shù)CGImageSourceUpdateDataProvider用于更新已存在的圖像源。
關(guān)于圖像的更多信息仰猖,可查看“Bitmap Images andImage Masks”捏肢。
Table 10-1 Functions that move data into Quartz 2D
表10-2列出地從Quartz 2D中獲取數(shù)據(jù)的方法奈籽。所有這些方法,除了CGPDFContextCreateWithURL鸵赫,都返回一個圖像目標(biāo)(CGImageDestinationRef)或者是數(shù)據(jù)消費者(CGDataComsumerRef)衣屏。圖像目標(biāo)和數(shù)據(jù)消費者抽象的數(shù)據(jù)寫入工作,讓Quartz來處理細節(jié)辩棒。
一個圖像目標(biāo)是獲取Quartz數(shù)據(jù)的首先方法狼忱。與圖像源一樣,圖像目標(biāo)也可以表示很多圖像數(shù)據(jù)一睁,如一個單獨圖片钻弄、多個圖片、縮略圖者吁、圖像屬性或者圖片文件窘俺。在獲取到CGImageDestinationRef后,我們可以完成以下工作:
使用函數(shù)CGImageDestinationAddImage或者CGImageDestinationAddImageFromSource添加一個圖像(CGImageRef)到目標(biāo)中复凳。一個CGImageRef表示一個圖片批销。
使用函數(shù)CGImageDestinationSetProperties設(shè)置屬性
使用函數(shù)CGImageDestinationCopyTypeIdentifiers和CGImageDestinationGetTypeID從圖像目標(biāo)中獲取信息。
函數(shù)CGPDFContextCreateWithURL可以方便地將PDF數(shù)據(jù)寫入URL指定的位置染坯。
數(shù)據(jù)消費者是一種老的機制,有很多限制丘逸。它們用于寫圖像或PDF數(shù)據(jù)单鹿。我們可以將數(shù)據(jù)消費者用于:
PDF上下文創(chuàng)建函數(shù)CGPDFContextCreate。該函數(shù)返回一個圖形上下文深纲,用于記錄一系列的PDF繪制命令仲锄。
函數(shù)CGImageDestinationCreateWithDataConsumer,用于從數(shù)據(jù)消費者中創(chuàng)建圖像目標(biāo)湃鹊。
關(guān)于圖像的更多信息儒喊,可查看“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