Quartz 2D編程指南之十:Quartz 2D中的數(shù)據(jù)管理

本文轉(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

傳輸數(shù)據(jù)給Quartz 2D

表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

獲取Quartz 2D的數(shù)據(jù)

表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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末币呵,一起剝皮案震驚了整個濱河市怀愧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌余赢,老刑警劉巖芯义,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妻柒,居然都是意外死亡扛拨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門举塔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绑警,“玉大人求泰,你說我怎么就攤上這事〖坪校” “怎么了渴频?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長章郁。 經(jīng)常有香客問我枉氮,道長,這世上最難降的妖魔是什么暖庄? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任聊替,我火速辦了婚禮,結(jié)果婚禮上培廓,老公的妹妹穿的比我還像新娘惹悄。我一直安慰自己,他們只是感情好肩钠,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布泣港。 她就那樣靜靜地躺著,像睡著了一般价匠。 火紅的嫁衣襯著肌膚如雪当纱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天踩窖,我揣著相機與錄音坡氯,去河邊找鬼。 笑死洋腮,一個胖子當(dāng)著我的面吹牛箫柳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啥供,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悯恍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伙狐?” 一聲冷哼從身側(cè)響起涮毫,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鳞骤,沒想到半個月后窒百,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡豫尽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年篙梢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片美旧。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡渤滞,死狀恐怖贬墩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妄呕,我是刑警寧澤陶舞,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站绪励,受9級特大地震影響肿孵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疏魏,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一停做、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧大莫,春花似錦蛉腌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至羔味,卻和暖如春河咽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赋元。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工库北, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人们陆。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像情屹,于是被迫代替她去往敵國和親坪仇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容