Quartz 2D概述

???????????? 在Mac OS X中,Quartz 2D可以處理所有的圖形和圖形技術---Core Image,Core Video,OpenGL,QuickTime。可以使用QuickTime GraphicsImportCreateCGImage函數創建一個圖形通過QucikTime Framework 的入口。有關詳細信息,可以參照QuickTime Framework的引用。在Mac OS X上在Quartz 2D 和 Core Image 交換數據形象描述了如何為Core Image提供圖像。(這是一個框架,支持圖像處理)。

??????????? 同樣,在iOS中,Quartz 2D 可以使用所有可用的圖形和動畫技術,如核心動畫,OpenGL ES,和UIKit 類;

概述里主要介紹:

? ?? 1.? ?? ? The Page(頁面)

? ?? 2.????? Graphics States 圖形狀態

? ?? 3.?????? Quartz 2D Opaque Data Types Quartz 2D 不透明? 數據類型

? ?? 4.? ? ?? Quartz 2D Coordinate Systems? 坐標系統

???? 5.??????? Memory Management: Object Ownership? 內存管理對象所有權

????????? The Page(頁面)

? ? ? ? ? Quartz 2D 在成像過程中使用了繪畫模型,在繪畫模型中,每一個連續的繪圖操作適用于layer 層的繪制到畫布的輸出,這經常被稱作畫布。額外的繪圖操作可以覆蓋原有頁面上的繪圖。這個模型允許你從一個小數量的強大的原語構造非常復雜的圖像。

?? 圖1-1顯示了 繪圖模型是如果工作的, 上面的圖中后來的固體形狀覆蓋了第一個圖,只留下了邊界。下滿的圖 后面的形狀在固體形狀中得以保留。所以畫圖的順序是很重要的。

頁面可能是一個真正的紙(如果輸出設備是一臺打印機);這可能是一個虛擬的紙(如果輸出設備是一個PDF文件),甚至可能是一個位圖圖像。頁面的確切性質取決于您所使用的特定的圖形上下文。? ?

Drawing Destinations: The Graphics Context 繪制的目的地:圖形上下文

? 圖形上下文是一個不透明的數據類型(CGContextRef)這個數據類型封裝了使用Quartz 2D輸出到設備上的信息,比如PDF文件,位圖,或在顯示窗口。圖形上下文的信息包含了圖形繪制參數和特定的設備展示在繪制頁面上。Quartz 2D 里的所有對象都被繪制包括圖形上下文。

你可以把一個圖形上下文想象為一個繪圖目標,如圖1-2所示。當您使用Quartz 2D時,所有的設備特定的特性都包含在您使用的特定類型的圖形上下文中。換言之,你可以通過提供一個不同的圖形上下文來繪制相同的圖像到一個不同的設備相同的順序的Quartz 2D繪圖程序。您不需要執行任何設備特定的計算,Quartz 2D為您做的。


????????? 這些圖形上下文都可以在你的應用程序中用到:

? ? ? Abitmap graphics context 位圖圖形上下文允許你繪制RGB、CMYK顏色或灰度圖轉化為位圖。位圖是一個像素的矩形陣列(或光柵),每一個像素代表一個圖像中的一個點。位圖圖像也被稱為采樣圖像。請參考Creating a Bitmap Graphics Context。?

? ? 一個PDF圖形上下文允許你創建一個PDF文件。在一個PDF文件,你畫的圖保存為一個命令序列。有PDF文件和位圖的一些顯著的差異 : ?

? ? ?? PDF文件,不像位圖,可以包含多個頁面。

? ? ? 當你畫一個頁面在不同的設備上的PDF文件,得到的圖像是該設備的顯示特性優化。

? ? ? PDF文件本質上是分辨率獨立的,被繪制的大小可以無限增加或者減少,而不用犧牲圖像細節。位圖圖像的用戶感知質量與位圖的被瀏覽的分辨率聯系在一起。請參考Creating a PDF Graphics Context。

? ? ? 一個窗口圖形上下文是一個圖形上下文,可以用來繪制一個窗口。請注意,因為石英是一個圖形引擎,而不是一個窗口管理系統,你使用的應用程序框架之一來獲得一個窗口的圖形上下文。SeeCreating a Window Graphics Context in Mac OS Xfor details.

??????? A layer context (CGLayerRef)? ? 層的上下文是一個離屏繪制與另一個圖形上下文相關的目的地。當你把layer 繪制到它所創建的上下文的時候,性能是最佳的。對于離屏繪制來說,layer congtext 比起位圖上下文來說是個更好地選擇。SeeCore Graphics Layer Drawing。

? ????? 當你想在Mac OS X 上打印時,你把內容發送給PostScript graphics context(被打印框架管理)。SeeObtaining a Graphics Context for Printingfor more information。

? ? Quartz 2D Opaque Data Types Quartz 2D 不透明? 數據類型

? ????? Quartz 2D 除了定義圖像上下文之外還定義了各種不透明的數據類型。應為API是? CoreGraphics框架的一部分,數據類型和操作例程都使用CG前綴。

???????? Quartz 2D根據我們需要操作的數據類型進行創建,已實現一個特性的繪圖輸出。

???????? 圖1-3顯示了你可以實現的結果當你應用繪圖操作三個Quartz 2D對象的情況:

? ? ? ? ? ? ? ? (1):你可以旋轉,通過創建一個PDF頁面對象顯示PDF頁面,應用旋轉操作的圖形上下文,并要求Quartz 2D繪制頁面圖形上下文。

? ? ? ? ? ? ? ? (2):可以通過創建一個模式對象來繪制模式,定義構成模式的形狀,并在繪制圖形上下文時設置一個用于繪制圖形的Quartz 2D圖形。

? ? ? ? ? ? ? ? (3) :您可以通過創建一個陰影對象(提供了決定陰影中每個點的顏色的方法)來填充一個軸向或徑向的陰影區域,然后要求陰影對象作為填充顏色。

?

???? Quartz 2D? 中可用的不透明的數據類型有一下幾種 :

? ? ? ? CGPathRef : 用來創建你填充或者描邊的矢量圖形;SeePaths.

? ? ? ?? CGImageRef:? 用來表示位圖圖像和基于你提供的樣本數據的位圖掩模。SeeBitmap Images and Image Masks.。

? ? CGLayerRef:用來表示一個圖層,可用于重復繪制(如背景或模式)和離屏繪制。SeeCore Graphics Layer Drawing;

? CGPatternRef:用于重復繪制,SeePatterns.

CGShadingRef and CGGradientRef:用來繪制漸變,SeeGradients.

CGFunctionRef:用于定義回調函數,以浮點任意參數。當您創建漸變的陰影時,您使用此數據類型。SeeGradients.

CGColorRef and CGColorSpaceRef:用來告知Quartz 2D如何解析顏色。SeeColor and Color Spaces.

CGImageSourceRef and CGImageDestinationRef:你可以用它來將數據移入和移出Quartz 2D。在Quartz 2D和圖像I / O編程指南中看到數據管理。SeeData Management in Quartz 2DandImage I/O Programming Guide.

CGFontRef:用于繪制文本;SeeText.

CGPDFDictionaryRef, CGPDFObjectRef, CGPDFPageRef, CGPDFStream, CGPDFStringRef, and CGPDFArrayRef:它提供了訪問PDF元數據,SeePDF Document Creation, Viewing, and Transforming.

CGPDFScannerRef and CGPDFContentStreamRef:解析PDF元數據,SeePDF Document Parsing

CGPSConverterRef:在iOS不可用,SeePostScript Conversion.

Graphics States 圖形狀態

???????? Quartz 2D修改繪圖操作的結果根據當前圖形狀態的參數。圖形狀態包含參數,否則被視為繪圖程序的參數。例程比如畫一個圖形上下文需要參考圖形狀態來決定如何渲染他們的結果。例如,當你調用一個函數來設置填充顏色,你修改的值存儲在當前圖形狀態,所以得參考當天圖形狀態。其他常用元素的當前圖形狀態包括線寬、當前位置、文本字體大小。

???????? 圖形上下文包含一個圖形狀態的堆棧,當你創建圖形上下文時,堆棧 是空的,當你保存圖形狀態時,Quartz把當前圖形狀態拷貝一份并且推到棧頂上。當你恢復圖形狀態時,Quartz 把圖形狀態推出棧頂,推出的狀態成為當前的圖形狀態;

? ? ? ? 保存當前的圖形狀態,使用方法CGContextSaveGState,拷貝一份當前圖形狀態并且推到棧上。為了恢復之前保存的圖形狀態,使用方法CGContextRestoreGState用棧頂的圖形狀態替換當前的圖形狀態。

? ? ? 請注意,不是當前繪圖環境的所有方面都是圖形狀態的元素。例如,當前的路徑是不被認為是圖形狀態的一部分,因此也沒有保存當你調用函數CGContextSaveGState的時候。當你調用這個函數的時候能夠被保存的參數在下列的列表中:

?


Quartz 2D Coordinate Systems?? 坐標系統

一個坐標系,圖1-4所示,定義了用于表示位置和大小的物體被繪制在頁面上的位置范圍。您指定在用戶空間坐標系中的圖形的位置和大小,或者,更簡單地說,用戶空間。坐標被定義為浮點值。


由于不同的設備有不同的底層成像能力,圖形的位置和大小必須以設備無關的方式定義。例如,一個屏幕顯示設備可能能夠顯示不超過96像素每英寸,而一臺打印機可能是能夠顯示每英寸300像素。如果您在設備級定義坐標系統(在這個例子中,或者96像素或300像素),在該空間中繪制的對象不能被復制在其他設備上而沒有可見的失真。他們會顯得太大或太小。

Quartz完成設備獨立性通過一個分離開來的坐標系統----用戶空間 ---映射到輸出設備的坐標系統---設備空間---采用當前的變換矩陣,或者CTM。矩陣是一個數學結構,用來有效地描述一組相關的方程組當前變換矩陣是一種特殊類型的矩陣,稱為仿射變換,它映射點從一個坐標空間到另一個通過應用平移,旋轉和縮放操作(計算,移動,旋轉,調整坐標系統)。

當前的變換矩陣有一個次要目的:它允許你在繪制對象的時候進行旋轉。例如,畫一個旋轉45°的框的時候,在畫框之前旋轉了當前頁面的坐標系統,Quartz在輸出設備上使用的就是旋轉后的坐標系。

在用戶空間中的一個點表示的坐標對(X,Y),其中X代表沿水平軸(左和右)和Y的位置和Y代表垂直軸(上下)。用戶坐標空間的原點是(0,0)的點。原點坐落在頁面的左下角,如圖1-4所示。Quartz默認的坐標系統,在頁面中,它從左到右的X軸增加在Y軸的增加值從底部向頂部。

一些技術使用不同的默認坐標系統來設置他們的圖形上下文,而不是Quartz默認的坐標系統。相對于Quartz,這樣的坐標系統是一個修改的坐標系,在執行一些繪圖操作必須進行補償。最常見的修改坐標系統是 左上角是原點,沿著y軸指向頁面底部。一些地方,你可能會看到這個特定的坐標系統使用的是:

????????? 1°:在Mac OS X中,一個NSView的重寫了它的isFlipper方法并且返回YES的子類的時候。

????????? 2°:iOS中,由一個UIView返回的繪圖上下文。

? ? ? ? ? 3°:iOS中,繪圖上下文調用UIGraphicsBeginImageContextWithOptions函數創建。

? 為什么UIKit框架修改了坐標系統是因為UIKit使用不同的默認坐標習慣。它轉換了Quartz的坐標系統使之能夠匹配自己的習慣。假如你的應用需要使用相同的繪圖程序繪制一個UIView和一個PDF圖形上下文(它通過Quartz創建,使用的是默認的坐標系統),你需要轉換PDF上下文的坐標系統和UIView 的坐標系統一樣。為此,你需要轉換PDF上下文的坐標原點到左上角和y軸的方向。 ???????????????????????

使用縮放變化否定了在Quartz繪圖時y坐標的改變。舉個例子,在你調用CGContextDrawImage繪制的時候,當繪制在目的地的時候圖片被轉換。同樣的,路徑繪制例程接受一些參數,這些參數指定了一個圓弧在默認的坐標系統是順時針還是逆時針。假如一個坐標系統被修改,他的結果也被修改,就像一個圖片反射在鏡子里。圖1-5,傳遞相同的參數,一個是逆時針默認的坐標系,一個是順時針的轉換后的坐標系。


?????? 它是取決于你的應用程序來調整Quartz調用上下文,這些上下文已經做了調整。例如,如果 你想要一個圖形或者PDF畫出準確的上下文,您的應用程序也許需要臨時調整圖形上下文的CTM(當前矩陣轉換)。在iOS中,你使用圖片對象包裹你創建的CGImage對象,你不需要修改CTM,通過UIKit框架,圖片對象會自動為即將修改的坐標系統補償。

???? Important:在你計劃直接利用Quartz在iOS 上寫程序的時候以上討論是很容易理解的,但這遠遠不夠,在iOS 3.2以后當你創建上下文的時候,還是有額外的變化要去匹配UIKit默認的慣例。尤其是,模式和陰影,它們并不被CTM影響,需要單獨調整來匹配UIKit的坐標系統。這種情況下,CTM就沒有等效的機制使你用Quartz創建的上下文能夠匹配操作UIKit的行為。你的應用程序必須認識到哪一種被繪制的上下文需要調整從而達到符合上下文的期望。

Memory Management: Object Ownership? 內存管理對象所有權

Quar采用引用計數管理內存。創建時,引用計數為1,可以通過調用函數來增加引用計數,以及通過調用函數來釋放引用計數來釋放對象。當引用計數減為0,對象被釋放。該模型允許對象安全地共享對其他對象的引用。

有幾個簡單的規則要記住:

???? 1° : 創建或者拷貝對象,當你使用完后必須釋放掉,否則會造成內存泄漏。

? ? 2°: 假如你不曾擁有一個對象,可是想持有他的屬性。你必須retain 和release它在使用完之后。在Quartz中有指定的方法去持有一個對象和釋放一個對象。比如,當你引用了一個CGColorspace對象,你需要使用CGColorSpaceRetain and CGColorSpaceRelease持有它,并且在需要的時候釋放掉。你也可以用Core Foundation 的方法: CFRetain and CFRelease。但是你一定要特別小心不要傳遞NULL給這些方法。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 本文翻譯自蘋果官方文檔:原文地址 Quartz 2D 概述 Quartz 2D 是一個二維的繪畫引擎,在Mac O...
    己庚辛壬癸閱讀 945評論 0 1
  • Quartz 2D是iOS系統以及所有Mac OSX應用內核外的二維繪制引擎。可以使用* Quartz 2D* A...
    SHChen閱讀 435評論 1 5
  • Quartz 2D是一個二維繪圖引擎,可在iOS環境中和內核之外的所有Mac OS X應用程序環境中訪問。您可以使...
    權宜平和閱讀 519評論 0 0
  • 中國文化博大精深,華人情感比較含蓄,對外來文化往往冠以洪水猛獸,牛鬼蛇神。比如戀愛,接吻擁抱,比如比基尼,比如暴露...
    情詩帥哥閱讀 158評論 0 0
  • 記憶中有人私信要我推薦書單,每次遇到這種問題,其實讓我都有點犯難。因為總覺得讀書與個人的喜好非常相關。所以在推薦之...
    桐梓22閱讀 368評論 1 4