Quartz 2D編程指南 (十四) —— 位圖圖像和圖像蒙版(二)

版本記錄

版本號 時間
V1.0 2018.09.08

前言

Quartz 2D框架相信大家都知道,也都一直在使用。Quartz 2D的API是純C語言的,它是一個二維繪圖引擎,同時支持iOS和Mac系統。Quartz 2D的API來自于Core Graphics框架,數據類型和函數基本都以CG作為前綴,接下來幾篇我們就一起來看一下這個框架。感興趣可以看上面幾篇文章。
1. Quartz 2D編程指南 (一) —— 簡介(一)
2. Quartz 2D編程指南 (二) —— Quartz 2D概覽(二)
3. Quartz 2D編程指南 (三) —— 圖形上下文(三)
4. Quartz 2D編程指南 (四) —— Paths路徑(一)
5. Quartz 2D編程指南 (五) —— Paths路徑(二)
6. Quartz 2D編程指南 (六) —— 顏色和顏色空間(一)
7. Quartz 2D編程指南 (七) —— 變換(一)
8. Quartz 2D編程指南 (八) —— Patterns圖案樣式(一)
9. Quartz 2D編程指南 (九) —— 陰影(一)
10. Quartz 2D編程指南 (十) —— 漸變(一)
11. Quartz 2D編程指南 (十一) —— 透明層(一)
12. Quartz 2D編程指南 (十二) —— Quartz 2D中的數據管理(一)
13. Quartz 2D編程指南 (十三) —— 位圖圖像和圖像蒙版(一)

Using Blend Modes with Images - 使用混合模式與圖像

您可以使用Quartz 2D混合模式(請參閱Setting Blend Modes)來合成兩個圖像,或者將圖像合成到已經繪制到圖形上下文的任何內容上。 本節討論在背景圖上合成圖像。

在背景上合成圖像的一般過程如下:

  • 1) 畫背景。
  • 2) 通過使用其中一個混合模式常量調用函數CGContextSetBlendMode來設置混合模式。 (混合模式基于PDF Reference, Fourth Edition, Version 1.5, Adobe Systems, Inc.
  • 3) 通過調用CGContextDrawImage函數繪制要在背景上合成的圖像。

此代碼片段使用“darken”混合模式在背景上合成一個圖像:

CGContextSetBlendMode (myContext, kCGBlendModeDarken);
CGContextDrawImage (myContext, myRect, myImage2);

本節的其余部分使用Quartz中可用的每種混合模式在背景上繪制圖11-17右側所示的圖像,該背景由圖左側顯示的繪制矩形組成。 在所有情況下,矩形首先被繪制到圖形上下文。 然后,通過調用函數CGContextSetBlendMode設置混合模式,傳遞適當的混合模式常量。 最后,跳躍者的圖像被繪制到圖形上下文中。

Figure 11-17 Background drawing (left) and foreground image (right)

1. Normal Blend Mode - 正常混合模式

正常混合模式在背景圖像樣本上繪制源圖像樣本。 普通混合模式是Quartz中的默認混合模式。 如果您當前正在使用其他混合模式并且想要切換到普通混合模式,則只需要顯式設置正常混合模式。 您可以通過將常量kCGBlendModeNormal傳遞給函數CGContextSetBlendMode或通過使用函數CGContextRestoreGState恢復圖形狀態(假設先前的圖形狀態使用正常混合模式)來設置正常混合模式。

圖11-18顯示了使用普通混合模式在同一圖中所示的矩形上繪制圖11-17所示圖像的結果。 在此示例中,使用alpha值1.0繪制圖像,因此背景完全被圖像遮擋。

Figure 11-18 Drawing an image over a background using normal blend mode

2. Multiply Blend Mode - 乘法混合模式

乘法混合模式將源圖像樣本與背景圖像樣本相乘。 所得圖像中的顏色至少與兩種樣本顏色中的任何一種顏色一樣深。

通過將常量kCGBlendModeMultiply傳遞給函數CGContextSetBlendMode來指定乘法混合模式。圖11-19顯示了使用乘法混合模式在同一圖中所示的矩形上繪制圖11-17所示的圖像的結果。

Figure 11-19 Drawing an image over a background using multiply blend mode

3. Screen Blend Mode - 屏幕混合模式

屏幕混合模式將源圖像樣本的倒數與背景圖像樣本的倒數相乘,以獲得至少與兩個樣本顏色中的任一個一樣輕的顏色。

您可以通過將常量kCGBlendModeScreen傳遞給函數CGContextSetBlendMode來指定屏幕混合模式。 圖11-20顯示了使用屏幕混合模式在同一圖中所示的矩形上繪制圖11-17所示圖像的結果。

Figure 11-20 Drawing an image over a background using screen blend mode

4. Overlay Blend Mode - 疊加混合模式

疊加混合模式將源圖像樣本與背景圖像樣本相乘或screens,具體取決于背景樣本的顏色。 結果是覆蓋現有圖像樣本,同時保留背景的高光和陰影。 背景顏色與源圖像混合以反映背景的亮度或暗度。

您可以通過將常量kCGBlendModeOverlay傳遞給函數CGContextSetBlendMode來指定疊加混合模式。 圖11-21顯示了使用疊加混合模式在同一圖中所示的矩形上繪制圖11-17所示圖像的結果。

Figure 11-21 Drawing an image over a background using overlay blend mode

5. Darken Blend Mode - 變暗混合模式

變暗混合模式通過從源圖像或背景中選擇較暗的樣本來創建合成圖像樣本。 比背景圖像樣本更暗的源圖像樣本替換相應的背景樣本。

您可以通過將常量kCGBlendModeDarken傳遞給函數CGContextSetBlendMode來指定變暗混合模式。 圖11-22顯示了使用變暗混合模式在同一圖中所示的矩形上繪制圖11-17所示圖像的結果。

Figure 11-22 Drawing an image over a background using darken blend mode

6. Lighten Blend Mode - 變淺混合模式

通過從源圖像或背景中選擇較亮的樣本,“變淺混合”模式可創建合成圖像樣本。 比背景圖像樣本輕的源圖像樣本替換相應的背景樣本。

您可以通過將常量kCGBlendModeLighten傳遞給函數CGContextSetBlendMode來指定lighten blend模式。 圖11-23顯示了使用淡化混合模式在同一圖中所示的矩形上繪制圖11-17中所示的圖像的結果。

Figure 11-23 Drawing an image over a background using lighten blend mode

7. Color Dodge Blend Mode - 顏色Dodge混合模式

顏色Dodge混合模式增亮背景圖像樣本以反映源圖像樣本。 指定黑色的源圖像樣本值保持不變。

您可以通過將常量kCGBlendModeColorDodge傳遞給函數CGContextSetBlendMode來指定顏色dodge混合模式。 圖11-24顯示了使用顏色Dodge混合模式在同一圖中所示的矩形上繪制圖11-17所示圖像的結果。

Figure 11-24 Drawing an image over a background using color dodge blend mode

8. Color Burn Blend Mode - 彩色混合模式

彩色燃燒混合模式使背景圖像樣本變暗以反映源圖像樣本。 指定白色的源圖像樣本值保持不變。

您可以通過將常量kCGBlendModeColorBurn傳遞給函數CGContextSetBlendMode來指定顏色混合模式。 圖11-25顯示了使用彩色混合模式在同一圖中所示的矩形上繪制圖11-17所示圖像的結果。

Figure 11-25 Drawing an image over a background using color burn blend mode

9. Soft Light Blend Mode - 柔光混合模式

柔和光線混合模式可以使顏色變暗或變亮,具體取決于源圖像樣本顏色。 如果源圖像樣本顏色淺于50%灰色,則背景變亮,類似于dodging。 如果源圖像樣本顏色深于50%灰色,則背景變暗,類似于burning。 如果源圖像樣本顏色等于50%灰色,則背景不會改變。

等于純黑色或純白色的圖像樣本會產生較暗或較亮的區域,但不會產生純黑色或白色。 整體效果類似于通過在源圖像上照射漫反射聚光燈而實現的效果。

您可以通過將常量kCGBlendModeSoftLight傳遞給函數CGContextSetBlendMode來指定柔光混合模式。 圖11-26顯示了使用柔光混合模式在同一圖中所示的矩形上繪制圖11-17所示圖像的結果。

Figure 11-26 Drawing an image over a background using soft light blend mode

10. Hard Light Blend Mode - 硬光混合模式

硬光混合模式可以倍增或屏幕顏色,具體取決于源圖像樣本顏色。 如果源圖像樣本顏色淺于50%灰色,則背景會變亮,類似于screening。 如果源圖像樣本顏色深于50%灰色,則背景變暗,類似于multiplying。 如果源圖像樣本顏色等于50%灰色,則源圖像不會更改。 等于純黑色或純白色的圖像樣本產生純黑色或白色。 整體效果類似于通過在源圖像上發出刺眼的聚光燈而實現的效果。

您可以通過將常量kCGBlendModeHardLight傳遞給函數CGContextSetBlendMode來指定硬光混合模式。 圖11-27顯示了使用硬光混合模式在同一圖中所示的矩形上繪制圖11-17所示圖像的結果。

Figure 11-27 Drawing an image over a background using hard light blend mode

11. Difference Blend Mode - 差異混合模式

差異混合模式從背景圖像樣本顏色中減去源圖像樣本顏色,或者相反,取決于哪個樣本具有更大的亮度值。 黑色的源圖像樣本值不會產生任何變化;白色反轉背景顏色值。

您可以通過將常量kCGBlendModeDifference傳遞給函數CGContextSetBlendMode來指定差異混合模式。 圖11-28顯示了使用差異混合模式在同一圖中顯示的矩形上繪制圖11-17所示圖像的結果。

Figure 11-28 Drawing an image over a background using difference blend mode

12. Exclusion Blend Mode - 排除混合模式

排除混合模式生成差異混合模式的低對比度版本。 黑色的源圖像樣本值不會產生變化;白色反轉背景顏色值。

您可以通過將常量kCGBlendModeExclusion傳遞給函數CGContextSetBlendMode來指定排除混合模式。 圖11-29顯示了使用排除混合模式在同一圖中所示的矩形上繪制圖11-17所示圖像的結果。

Figure 11-29 Drawing an image over a background using exclusion blend mode

13. Hue Blend Mode - 色調混合模式

色調混合模式使用背景的亮度和飽和度值以及源圖像的色調。 您可以通過將常量kCGBlendModeHue傳遞給函數CGContextSetBlendMode來指定色調混合模式。 圖11-30顯示了使用色調混合模式在同一圖中所示的矩形上繪制圖11-17所示圖像的結果。

Figure 11-30 Drawing an image over a background using hue blend mode

14. Saturation Blend Mode - 飽和度混合模式

飽和度混合模式使用背景的亮度和色調值以及源圖像的飽和度。 純灰色區域不會產生變化。 您可以通過將常量kCGBlendModeSaturation傳遞給函數CGContextSetBlendMode來指定飽和度混合模式。 圖11-31顯示了使用飽和度混合模式在同一圖中所示的矩形上繪制圖11-17中所示的圖像的結果。

Figure 11-31 Drawing an image over a background using saturation blend mode

15. Color Blend Mode - 顏色混合模式

顏色混合模式使用背景的亮度值和源圖像的色調和飽和度值。 此模式保留圖像中的灰度級。 您可以通過將常量kCGBlendModeColor傳遞給函數CGContextSetBlendMode來指定顏色混合模式。 圖11-32顯示了使用顏色混合模式在同一圖中所示的矩形上繪制圖11-17所示圖像的結果。

Figure 11-32 Drawing an image over a background using color blend mode

16. Luminosity Blend Mode - 亮度混合模式

亮度混合模式使用背景的色調和飽和度以及源圖像的亮度來創建與顏色混合模式創建的效果相反的效果。

您可以通過將常量kCGBlendModeLuminosity傳遞給函數CGContextSetBlendMode來指定光度混合模式。 圖11-33顯示了使用光度混合模式在同一圖中所示的矩形上繪制圖11-17所示圖像的結果。

Figure 11-33 Drawing an image over a background using luminosity blend mode

后記

本篇主要講述了位圖圖像和圖像蒙版,感興趣的給個贊或者關注~~~

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

推薦閱讀更多精彩內容