Quartz 2D編程指南之四:顏色與顏色空間

本文轉載自: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值

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對象,然后將該對象傳遞給函數CGContextSetFillColorWithColorCGContextSetStrokeColorWithColor。我們可以按需要保持CGColor對象,并可以直接使用該對象來改進應用程序的顯示。

我們可以調用CGColorCreate函數來創建CGColor對象,該函數需要兩個參數:CGColorspace對象及顏色值數組。數組的最后一個值指定alpha值。

設置再現意圖(Rending Intent)

“再現意圖”用于指定如何將源顏色空間的顏色映射到圖形上下文的目標顏色空間的顏色范圍內。如果不顯示指定再現意圖,Quartz使用相對色度再現意圖(relative colorimetric rendering intent)應用于所有繪制(不包含位圖圖像)。對于位圖圖像,Quartz默認使用感知(perceptual)再現意圖。

我們可以調用CGContextSetRenderingIntent函數來設置再現意圖,并傳遞圖形上下文(graphics context)及下例常量作為參數:

kCGRenderingIntentDefault:使用默認的渲染意圖。

kCGRenderingIntentAbsoluteColorimetric:絕對色度渲染意圖。將輸出設備顏色域外的顏色映射為輸出設備域內與之最接近的顏色。這可以產生一個裁減效果,因為色域外的兩個不同的顏色值可能被映射為色域內的同一個顏色值。當圖形使用的顏色值同時包含在源色域及目標色域內時,這種方法是最好的。常用于logo或者使用專色(spot color)時。

kCGRenderingIntentRelativeColorimetric:相對色度渲染意圖。轉換所有的顏色(包括色域內的),以補償圖形上下文的白點與輸出設備白點之間的色差。kCGRenderingIntentPerceptual:感知渲染意圖。通過壓縮圖形上下文的色域來適應輸出設備的色域,并保持源顏色空間的顏色之間的相對性。感知渲染意圖適用于相片及其它復雜的高細度圖片。

kCGRenderingIntentSaturation:飽和度渲染意圖。把顏色轉換到輸出設備色域內時,保持顏色的相對飽和度。結果是包含亮度、飽和度顏色的圖片。飽和度意圖適用于生成低細度的圖片,如描述性圖表。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容