本文轉載自:http://southpeak.github.io/2014/12/01/quartz2d-4/
不同的設備(顯示器、打印機、掃描儀、攝像頭)處理顏色的方式是不同的。每種設備都有其所能支持的顏色值范圍。一種設備能支持的顏色可能在其它設備中無法支持。
為了有效的使用顏色及理解Quartz 2D中用于顏色及顏色空間的函數,我們需要熟悉在Color Management Overview文檔中所使用的術語。該文檔中討論了色覺、顏色值、設備依賴及設備顏色空間、顏色匹配問題、再現意圖(rendering intent)、顏色管理模塊和ColorSync。
在本章中,我們將學習Quartz處理顏色和顏色空間,以及什么是alpha組件。本章同時也討論如下問題:
創建顏色空間
創建和設置顏色
設置再現意圖
Quartz中的顏色是用一組值來表示。而顏色空間用于解析這些顏色信息。例如,表4-1列出了在全亮度下藍色值在不同顏色空間下的值。如果不知道顏色空間及顏色空間所能接受的值,我們沒有辦法知道一組值所表示的顏色。
Table 4-1 Color values in different color spaces
如果我們使用了錯誤的顏色空間,我們可能會獲得完全不同的顏色,如圖4-1所示。
Figure 4-1 Applying a BGR and an RGB color profile to the same image
顏色空間可以有不同數量的組件。表4-1中的顏色空間中其中三個只有三個組件,而CMYK有四個組件。值的范圍與顏色空間有關。對大部分顏色空間來說,顏色值范圍為[0.0, 1.0],1.0表示全亮度。例如,全亮度藍色值在Quartz的RGB顏色空間中的值是(0, 0, 1.0)。在Quartz中,顏色值同樣有一個alpha值來表示透明度。在表4-1中沒有列出該值。
alpha值是圖形狀態參數,Quartz用它來確定新的繪圖對象如何與已存在的對象混合。在全強度下,新的繪圖對象是不透明的。在0強度下,新的繪圖對象是完全透明的。圖4-2顯示了5個大的方形,分別使用了alpha值為1.0, 0.75, 0.5, 0.1和0.0。隨著大方形逐漸變得透明,底下的小的不透明的方形逐漸顯現出來。
Figure 4-2 A comparison of large rectangles painted using various alpha values
我們可以將兩個對象繪制到page上,而page可以在渲染前通過設置全局的graphics context來設置自己的透明度。圖4-3顯示了將全局的透明度設置為0.5和1.0的效果。
Figure 4-3 A comparison of global alpha values
在標準混合模式(圖形狀態的默認模式)下,Quartz使用下面的公式來混合源顏色和目標顏色的組件:
destination = (alphasource) + (1 - alpha)destination
其中源顏色是新繪制的顏色,目標顏色是背景顏色。該公式可用于新繪制的形狀和圖像。
對于對象透明度來說,alpha值為1.0時表示新對象是完全不透明的,值0.0表示新對象是完全透明的。0.0與1.0之間的值指定對象的透明度。我們可以為所有接受顏色的程序指定一個alpha值作為顏色值的最后一個組件。同樣也可以使用CGContextSetAlpha函數來指定全局的alpha值。記住,如果同時設置以上兩個值,Quartz將混合全局alpha值與對象的alpha值。
為了讓page完全透明,我們可以調用CGContextClearRect函數來清除圖形上下文(graphics context)的alpha通道。例如,我們可以在給圖標創建一個透明遮罩或者使窗口的背景透明時,采用這種方法。
Quartz支持顏色管理系統使用的標準顏色空間,也支持通用的顏色空間、索引顏色空間和模式(pattern)顏色空間。設備顏色空間以一種簡便的方法在不同設備間表示顏色。它用于在兩種不同設備間的本地顏色空間轉換顏色數據。設備依賴顏色空間的顏色在不同設備上顯示時效果是一樣的,它擴展了設備的能力。基于此,設備依賴顏色空間是顯示顏色時最好的選擇。
如果應用程序有精確的顏色表示需求,則應該總是使用設備依賴顏色空間。通用顏色空間(generic color space)是一種常用的設備依賴顏色空間。通用顏色空間通過操作系統為我們的應用程序提供最好的顏色空間。它能使在顯示器上與在打印機上打印效果是一樣的。
重要:IOS不支持設備依賴顏色空間或通用顏色空間。IOS應用程序必須使用設備顏色空間(device color space)。
為了創建設備依賴顏色空間,我們需要給Quartz提供白色參考點,黑色參考點及特殊設備的gamma值。Quartz使用這些信息將源顏色空間的顏色值轉化為輸出設備顏色空間的顏色值。
Quartz支持設備依賴顏色空間,創建此空間的函數如下:
L*a*b是非線性轉換,它屬于Munsell顏色符號系統(該系統使用色度、值、飽和度來指定顏色)。 L組件表示亮度值,a組件表示綠色與紅色之間的值,b組件表示藍色與黃色之間的值。該顏色空間設計用于模擬人腦解碼顏色。使用函數CGColorSpaceCreateLab來創建。
ICC顏色空間是由ICC(由國際色彩聰明,International Color Consortium)顏色配置而來的。ICC顏色配置了設備支持的顏色域,該顏色域與其它設備屬性相符,所以該信息可被用于將一個設備的顏色空間精確地轉換為另一個設備的顏色空間。大多數設備制造商都支持ICC配置。一些彩色顯示器和打印機都內嵌了ICC信息,用于處理諸如TIFF的位圖格式。使用函數CGColorSpaceCreateICCBased來創建。
標準化RGB是設備依賴的RGB顏色空間,它表示相對于白色參考點(設備可生成的最白的顏色)的顏色。 使用函數CGColorSpaceCreateCalibratedRGB來創建。
標準化灰度是設備依賴的灰度顏色空間,它表示相對于白色參考點(設備可生成的最白的顏色)的顏色。 使用函數CGColorSpaceCreateCalibratedGray來創建。
通用顏色空間的顏色與系統匹配。大部分情況下,結果是可接受的。就像名字所暗示的那樣,每個“通用”顏色空間(generic gray, generic RGB, generic CMYK)都是一個指定的設備依賴顏色空間。
通過顏色空間非常容易使用;我們不需要提供任何參考點信息。我們使用函數CGColorSpaceCreateWithName來創建一個通用顏色空間,該函數可傳入以下常量值:
kCGColorSpaceGenericGray:指定通用灰度顏色空間,該顏色空間是單色的,可以指定從0.0(純黑)到1.0(純白)范圍內的顏色值。
kCGColorSpaceGenericRGB:指定通用RGB顏色空間,該顏色空間中的顏色值由三個組件(red, green, blue)組成,主要用于彩色顯示器上的像素。RGB顏色空間中的每個組件的值范圍是[0.0, 1.0]。
kCGColorSpaceGenericCMYK:指定通用CMYK顏色空間,該顏色空間的顏色值由四個組件(cyan, magenta, yellow, black),主要用于打印機。CMYK顏色空間的每個組件的值范圍是[0.0, 1.0]。
設備顏色空間主要用于IOS應用程序,因為其它顏色空間無法在IOS上使用。大多數情況下,Mac OS X應用程序應使用通用顏色空間,而不使用設備顏色空間。但是有些Quartz程序希望圖像使用設備顏色空間。例如,如果調用CGImageCreateWithMask函數來指定一個圖像作為遮罩,圖像必須在設備的灰度顏色空間(device gray color space)中定義。
我們可以使用以下函數來創建設備顏色空間:
CGColorSpaceCreateDeviceGray:創建設備依賴灰度顏色空間
CGColorSpaceCreateDeviceRGB:創建設備依賴RGB顏色空間
CGColorSpaceCreateDeviceCMYK:創建設備依賴CMYK顏色空間
索引顏色空間包含一個有256個詞目的顏色表,和詞目映射到基礎顏色空間。顏色表中每個詞目指定一個基礎顏色空間中的顏色值。使用CGColorSpaceCreateIndexed函數來創建。
模式顏色空間在繪制模式時使用。 使用CGColorSpaceCreatePattern函數來創建。
Quartz提供了一套函數用于設置填充顏色、線框顏色、顏色空間和alpha值。每個顏色參數都是圖形狀態參數,這就意味著一旦設置了,設置將被保存并影響后續操作,直到被修改為止。
一個顏色必須有相關聯的顏色空間。否則,Quartz不知道如何解析顏色值。進一步說,說是我們必須為繪制目標提供一個合適的顏色空間。如圖4-4所示,左邊是CMYK顏色空間中的藍色填充色,右邊是RGB顏色空間中的藍色填充色。這兩個顏色值在理論上是一樣的,但只有在相同顏色空間下的相同顏色值顯示出來才是一樣的。
Figure 4-4 A CMYK fill color and an RGB fill color
我們可以使用CGContextSetFillColorSpace和CGContextSetStrokeColorSpace函數來設置填充和線框顏色空間,或者可以使用以下便利函數來設置設備顏色空間的顏色值。
Table 4-2 Color-setting functions
我們在填充及線框顏色空間中指定填充及線框顏色值。例如,在RGB顏色空間中,我們使用數組(1.0, 0.0, 0.0, 1.0)來表示紅色。前三個值指定紅色值為全強度,而綠色和藍色為零強度。第四個值為alpha值,用于指定顏色的透明度。
如果需要在程序中重復使用顏色,最有效的方法是通過設置填充色和線框色來創建一個CGColor對象,然后將該對象傳遞給函數CGContextSetFillColorWithColor及CGContextSetStrokeColorWithColor。我們可以按需要保持CGColor對象,并可以直接使用該對象來改進應用程序的顯示。
我們可以調用CGColorCreate函數來創建CGColor對象,該函數需要兩個參數:CGColorspace對象及顏色值數組。數組的最后一個值指定alpha值。
“再現意圖”用于指定如何將源顏色空間的顏色映射到圖形上下文的目標顏色空間的顏色范圍內。如果不顯示指定再現意圖,Quartz使用相對色度再現意圖(relative colorimetric rendering intent)應用于所有繪制(不包含位圖圖像)。對于位圖圖像,Quartz默認使用感知(perceptual)再現意圖。
我們可以調用CGContextSetRenderingIntent函數來設置再現意圖,并傳遞圖形上下文(graphics context)及下例常量作為參數:
kCGRenderingIntentDefault:使用默認的渲染意圖。
kCGRenderingIntentAbsoluteColorimetric:絕對色度渲染意圖。將輸出設備顏色域外的顏色映射為輸出設備域內與之最接近的顏色。這可以產生一個裁減效果,因為色域外的兩個不同的顏色值可能被映射為色域內的同一個顏色值。當圖形使用的顏色值同時包含在源色域及目標色域內時,這種方法是最好的。常用于logo或者使用專色(spot color)時。
kCGRenderingIntentRelativeColorimetric:相對色度渲染意圖。轉換所有的顏色(包括色域內的),以補償圖形上下文的白點與輸出設備白點之間的色差。kCGRenderingIntentPerceptual:感知渲染意圖。通過壓縮圖形上下文的色域來適應輸出設備的色域,并保持源顏色空間的顏色之間的相對性。感知渲染意圖適用于相片及其它復雜的高細度圖片。
kCGRenderingIntentSaturation:飽和度渲染意圖。把顏色轉換到輸出設備色域內時,保持顏色的相對飽和度。結果是包含亮度、飽和度顏色的圖片。飽和度意圖適用于生成低細度的圖片,如描述性圖表。