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ù)的功能开伏。 通過(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):

  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ù)本身,無(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ù)雜效果的圖像弄捕。

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è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)參閱位圖圖像和圖像掩碼

將數(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ā)行說(shuō)明点额。

有關(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允許您訪問(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小作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亭姥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子顾稀,更是在濱河造成了極大的恐慌达罗,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異粮揉,居然都是意外死亡巡李,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門扶认,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)侨拦,“玉大人,你說(shuō)我怎么就攤上這事辐宾∮樱” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵叠纹,是天一觀的道長(zhǎng)季研。 經(jīng)常有香客問(wèn)我,道長(zhǎng)誉察,這世上最難降的妖魔是什么与涡? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮持偏,結(jié)果婚禮上驼卖,老公的妹妹穿的比我還像新娘。我一直安慰自己综液,他們只是感情好款慨,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谬莹,像睡著了一般檩奠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上附帽,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天埠戳,我揣著相機(jī)與錄音,去河邊找鬼蕉扮。 笑死整胃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喳钟。 我是一名探鬼主播屁使,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奔则!你這毒婦竟也來(lái)了蛮寂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤易茬,失蹤者是張志新(化名)和其女友劉穎酬蹋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡范抓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年骄恶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匕垫。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡僧鲁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出年缎,到底是詐尸還是另有隱情悔捶,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布单芜,位于F島的核電站蜕该,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏洲鸠。R本人自食惡果不足惜堂淡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扒腕。 院中可真熱鬧绢淀,春花似錦、人聲如沸瘾腰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蹋盆。三九已至费薄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栖雾,已是汗流浹背楞抡。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留析藕,地道東北人召廷。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像账胧,于是被迫代替她去往敵國(guó)和親竞慢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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