位圖圖像和圖像蒙板就像Quartz中的任何圖形圖元。 Quartz中的圖像和圖像蒙板都由CGImageRef數據類型表示。正如你將在本章后面看到的,有多種功能可以用來創建圖像。其中一些需要數據提供者或圖像源來提供位圖數據。其他功能通過復制圖像或通過對圖像應用操作從現有圖像創建圖像。無論你如何在Quartz中創建位圖圖像,都可以將圖像繪制到任何圖形上下文的風格。請記住,位圖圖像是以特定分辨率的位數組。如果將位圖圖像繪制到獨立于分辨率的圖形上下文(例如PDF圖形上下文),位圖將受到創建它的分辨率的限制。
有一種方法來創建一個Quartz圖像蒙板 - 通過調用函數CGImageMaskCreate。您將看到如何在創建圖像掩碼中創建一個。應用圖像掩碼不是屏蔽圖形的唯一方法。使用顏色屏蔽圖像,使用圖像掩碼屏蔽圖像和通過剪切上下文來屏蔽圖像的部分討論了Quartz中可用的所有屏蔽方法。
關于位圖圖像和圖像掩碼
位圖圖像(或采樣圖像)是像素(或樣本)的陣列。 每個像素表示圖像中的單個點。 JPEG,TIFF和PNG圖形文件是位圖圖像的示例。 應用程序圖標是位圖圖像。 位圖圖像被限制為矩形形狀。 但是使用alpha組件,它們可以呈現為各種形狀,并且可以旋轉和剪切,如圖11-1所示。
位圖中的每個樣本包含指定顏色空間中的一個或多個顏色分量,以及指定用于指示透明度的Alpha值的一個附加分量。 每個組件可以從1到多達32位。 在Mac OS X中,Quartz還提供對浮點組件的支持。 Mac OS X和iOS中支持的格式在“位圖圖形上下文支持的像素格式”中有所描述。 ColorSync為位圖圖像提供顏色空間支持。
Quartz還支持圖像蒙板。 圖像掩碼是指定要繪制的區域,而不是顏色的位圖。 實際上,圖像掩模用作模板以指定在頁面上將顏色放置在何處。 Quartz使用當前填充顏色繪制圖像蒙版。 圖像掩碼可以具有1至8位的深度。
位圖圖像信息
Quartz支持各種各樣的圖像格式,并具有幾種流行格式的內置知識。 在iOS中,格式包括JPEG,GIF,PNG,TIF,ICO,GMP,XBM和CUR。 其他位圖圖像格式或專有格式要求您指定圖像格式的詳細信息到Quartz,以確保圖像被正確解釋。 您提供給函數CGImageCreate的圖像數據必須按每像素交錯,而不是每掃描線交錯。 Quartz不支持平面數據。
本節介紹與位圖圖像相關的信息。 當您創建并使用Quartz圖像(使用CGImageRef數據類型)時,您會看到一些Quartz圖像創建函數需要您指定所有這些信息,而其他函數需要此信息的一個子集。 您提供的內容取決于用于位圖數據的編碼,以及位圖是否表示圖像或圖像掩碼。
注:為了在使用原始圖像數據時獲得最佳性能,請使用vImage框架。 您可以使用vImageBuffer_InitWithCGImage函數將圖像數據從CGImageRef引用導入vImage。 有關詳細信息,請參閱加速發行說明。
Quartz在創建位圖圖像(CGImageRef)時使用以下信息:
- 位圖數據源,可以是Quartz數據提供程序或Quartz圖像源。 Quartz 2D中的數據管理描述了這兩種功能,并討論了提供位圖數據源的功能。
- 可選的解碼數組(Decode Array)。
- 插值設置,它是一個布爾值,指定Quartz在調整圖像大小時應應用插值算法。
- 渲染意圖,指定如何映射位于圖形上下文的目標顏色空間中的顏色。圖像掩碼不需要此信息。有關詳細信息,請參閱設置呈現意圖。
- 圖像尺寸。
- 像素格式,包括每個分量的位數,每像素的位數和每行的字節數(像素格式)。
- 對于圖像,顏色空間和位圖布局(顏色空間和位圖布局)信息來描述alpha的位置以及位圖是否使用浮點值。圖像掩碼不需要此信息。
解碼數組
解碼陣列將圖像顏色值映射到其他顏色值,這對于諸如使圖像去飽和或反轉顏色的任務是有用的。 該數組包含每個顏色分量的一對數字。 當Quartz渲染圖像時,將應用線性變換將原始組件值映射到適合目標顏色空間的指定范圍內的相對數。 例如,用于RGB顏色空間中的圖像的解碼陣列包含六個條目,對于每個紅色,綠色和藍色分量一對。
像素格式
像素格式由以下信息組成:
- 每分量比特,其是像素中每個單獨顏色分量中的比特數。 對于圖像掩碼,該值是源像素中的有效掩碼位的數目。 例如,如果源圖像是8位掩碼,請為每個分量指定8位。
- 每像素的位,其是源像素中的位的總數。 該值必須至少為每個組件的位數乘以每個像素的組件數。
- 每行字節數。 圖像中每水平行的字節數。
顏色空間和位圖布局
為了確保Quartz正確解釋每個像素的位,必須指定:
位圖是否包含Alpha通道。 Quartz支持RGB,CMYK和灰色色彩空間。它還支持alpha或透明度,雖然alpha信息不是在所有位圖圖像格式中可用。當其可用時,alpha分量可以位于像素的最高有效位或最低有效位。
對于具有alpha分量的位圖,無論顏色分量是否已經乘以alpha值。預乘alpha描述其源成分已經乘以α值的源色彩。預翻轉通過消除每個顏色分量的額外乘法運算來加速圖像的渲染。例如,在RGB顏色空間中,利用預乘α渲染圖像消除了圖像中的每個像素的三個乘法運算(紅色乘以alpha,綠色乘以alpha和藍色乘以alpha)。
樣本的數據格式 - 整數或浮點值。當使用函數CGImageCreate創建圖像時,提供一個bitmapInfo參數,類型為CGImageBitmapInfo,以指定位圖布局信息。以下常量指定alpha組件的位置以及顏色組件是否預乘:
kCGImageAlphaLast - 將alpha分量存儲在每個像素(例如,RGBA)的最低有效位中。
kCGImageAlpha首先,alpha分量存儲在每個像素的最高有效位中,例如,ARGB。
kCGImageAlphaPremultipliedLast - alpha分量存儲在每個像素的最低有效位中,顏色分量已經乘以該alpha值。
kCGImageAlphaPremultipliedFirst - alpha分量存儲在每個像素的最高有效位,顏色分量已經乘以該alpha值。
kCGImageAlphaNoneSkipLast - 沒有alpha組件。如果像素的總大小大于顏色空間中的顏色分量的數量所需的空間,則忽略最低有效位。
kCGImageAlphaNoneSkipFirst - 沒有alpha組件。如果像素的總大小大于顏色空間中的顏色分量的數量所需的空間,則忽略最高有效位。
kCGImageAlphaNone - 等價于kCGImageAlphaNoneSkipLast。
您可以使用常量kCGBitmapFloatComponents來指示使用浮點值的位圖格式。對于浮點格式,您將此常量與上一列表中的適當常數進行邏輯或運算。例如,對于使用預乘α的128位每像素浮點格式,alpha位于每個像素的最低有效位,您向Quartz提供以下信息:
kCGImageAlphaPremultipliedLast | kCGBitmapFloatComponents
圖11-2直觀地描述了在使用16位或32位整數格式的CMYK和RGB顏色空間中表示像素的方式。 32位整數像素格式每個分量使用8位。 16位整數格式每個組件使用5位。 Quartz 2D還支持128位浮點像素格式,每個組件使用32位。 128位格式未在圖中顯示。
創建圖像
表11-1列出了Quartz提供的用于創建CGImage對象的函數。圖像創建功能的選擇取決于圖像數據的來源。最靈活的功能是CGImageCreate。它從任何種類的位圖數據創建圖像。但是,它是最復雜的功能,因為您必須指定所有位圖信息。要使用此功能,您需要熟悉位圖圖像信息中討論的主題。
如果要從使用標準圖像格式(例如PNG或JPEG)的圖像文件創建CGImage對象,最簡單的解決方法是調用函數CGImageSourceCreateWithURL創建圖像源,然后調用函數CGImageSourceCreateImageAtIndex從而創建一個圖像在圖像源中的特定索引處的圖像數據。如果原始圖像文件只包含一個圖像,則提供0作為索引。如果圖像文件格式支持包含多個圖像的文件,則需要提供適當圖像的索引,請記住索引值從0開始。
如果你繪制了一個位圖圖形上下文的內容,并想要捕獲該圖形到一個CGImage對象,調用函數CGBitmapContextCreateImage。
幾個函數是對現有圖像進行操作的實用程序,以便進行復制,創建縮略圖或從較大的一部分創建圖像。無論如何創建CGImage對象,都可以使用函數CGContextDrawImage將圖像繪制到圖形上下文。記住,CGImage對象是不可變的。當你不再需要一個CGImage對象時,通過調用CGImageRelease函數釋放它。
以下部分討論如何創建:
- 來自現有圖像的子圖像
- 來自位圖圖形上下文的圖像
您可以參考這些來源獲取更多信息:
- Quartz 2D中的數據管理討論如何讀取和寫入圖像數據。
- CGImage參考,CGImageSource參考和CGBitmapContext參考有關表11-1中列出的功能及其參數的更多信息。
從較大圖像的一部分創建圖像
函數CGImageCreateWithImageInRect允許您從現有的Quartz圖像創建子圖像。 圖11-3示出通過提供指定字母“A”的位置的矩形來從更大的圖像中提取包含字母“A”的圖像。
由函數CGImageCreateWithImageInRect返回的圖像保留對原始圖像的引用,這意味著您可以在調用此函數后釋放原始圖像。
圖11-4顯示了提取圖像的一部分以創建另一個圖像的另一個示例。在這種情況下,公雞的頭部從較大的圖像中提取,然后繪制成大于子圖像的矩形,有效地放大圖像。
清單11-1顯示了創建并繪制子圖像的代碼。 CGContextDrawImage函數繪制公雞頭部的矩形的尺寸是提取的子圖像尺寸的兩倍。列表是一個代碼片段。你需要聲明適當的變量,創建公雞圖像,并處置公雞圖像和公雞頭子圖像。因為代碼是一個片段,它不顯示如何創建圖像被繪制的圖形上下文。你可以使用任何你喜歡的圖形上下文的風味。有關如何創建圖形上下文的示例,請參閱圖形上下文。
// 建子圖像并將其放大繪制的代碼
myImageArea = CGRectMake (rooster_head_x_origin, rooster_head_y_origin,
myWidth, myHeight);
mySubimage = CGImageCreateWithImageInRect (myRoosterImage, myImageArea);
myRect = CGRectMake(0, 0, myWidth*2, myHeight*2);
CGContextDrawImage(context, myRect, mySubimage);
從位圖圖形上下文創建圖像
要從現有位圖圖形上下文創建圖像,請調用函數CGBitmapContextCreateImage,如下所示:
CGImageRef myImage;
myImage = CGBitmapContextCreateImage (myBitmapContext);
函數返回的CGImage對象由復制操作創建。 因此,對位圖圖形上下文所做的任何后續更改都不會影響返回的CGImage對象的內容。 在一些情況下,復制操作實際上遵循寫時復制語義,使得僅當位圖圖形上下文中的底層數據被修改時才出現位的實際物理副本。 您可能需要使用生成的圖像并釋放它,然后再執行額外的繪制到位圖圖形上下文中,以便可以避免數據的實際物理副本。
有關顯示如何創建位圖圖形上下文的示例,請參閱創建位圖圖形上下文。
創建圖像掩碼
Quartz位圖圖像掩碼的使用方式與藝術家使用絲網印刷相同。位圖圖像掩碼確定如何傳輸顏色,而不是使用哪些顏色。圖像掩碼中的每個樣本值指定在特定位置掩蔽當前填充顏色的量。樣本值指定掩碼的不透明度。較大的值表示較大的不透明度,并指定Quartz涂料顏色較少的位置。您可以將樣本值視為反阿爾法值。值1是透明的,0是不透明的。
圖像掩碼為每個組件1,2,4或8位。對于1位掩碼,樣本值1指定掩碼的阻止當前填充顏色的部分。樣本值0指定掩碼的部分,其顯示當繪制掩碼時圖形狀態的當前填充顏色。你可以認為1位掩碼是黑白的;樣品完全阻擋漆或完全允許漆。
每個組件具有2,4或8位的圖像掩碼表示灰度值。每個組件使用以下公式映射到0到1的范圍:
例如,4位掩碼具有以1/15的增量在從0到1的范圍內的值。 0或1的組件值代表極端 - 完全阻止油漆,并完全允許油漆。 0和1之間的值允許使用公式1 - MaskSampleValue進行局部繪畫。 例如,如果8位掩碼的樣本值縮放到0.7,則顏色將被繪制為具有(1-0.7)的α值,即為0.3。
函數CGImageMaskCreate從您提供的位圖圖像信息中創建一個Quartz圖像掩碼,這將在位圖圖像信息中討論。 您提供用于創建圖像掩碼的信息與創建圖像時所提供的信息相同,但您不提供顏色空間信息,位圖信息常量或渲染意圖,您可以通過查看函數 示例11-2。
// 函數CGImageMaskCreate的原型
CGImageRef CGImageMaskCreate (
size_t width,
size_t height,
size_t bitsPerComponent,
size_t bitsPerPixel,
size_t bytesPerRow,
CGDataProviderRef provider,
const CGFloat decode[],
bool shouldInterpolate
);
掩碼圖像
掩碼技術可以通過控制圖像的哪些部分來繪制來產生許多有趣的效果。 您可以:
- 對圖像應用圖像蒙版。 您還可以使用圖像作為掩碼來實現與應用圖像掩碼相反的效果。
- 使用顏色來遮蔽圖像的部分,這包括稱為色度鍵掩碼的技術。
- 將圖形上下文剪切到圖像或圖像掩碼,當Quartz將內容繪制到剪輯的上下文時,它有效地掩蓋圖像(或任何類型的圖形)。
使用圖像蒙板掩碼圖像
函數CGImageCreateWithMask返回通過向圖像應用圖像蒙版所創建的圖像。 此函數有兩個參數:
- 您要應用蒙版的圖像。 此圖像不能是圖像掩碼或具有與其關聯的掩蔽顏色(請參閱使用顏色掩蔽圖像)。
- 通過調用函數CGImageMaskCreate創建的圖像掩碼。 它可以提供一個圖像而不是圖像蒙版,但是給出了一個非常不同的結果。 請參閱使用圖像屏蔽圖像。
圖像掩碼的源樣本用作逆alpha值。 圖像掩碼樣本值(S):
- 等于1塊繪制相應的圖像樣本。
- 等于0允許以完全覆蓋的方式繪制相應的圖像樣本。
- 大于0和小于1允許用α值(1-S)繪制對應的圖像樣本。
圖11-5顯示了使用Quartz圖像創建函數創建的圖像,圖11-6顯示了使用函數CGImageM創建的圖像掩碼
注意,原始圖像中對應于掩模的黑色區域的區域在所得到的圖像中顯示通過(圖11-7)。 與面罩的白色區域相對應的區域不被涂漆。 對應于掩模中的灰色區域的區域使用等于1減去圖像掩模樣本值的中間alpha值來繪制。
用圖像掩蔽圖像
您可以使用函數CGImageCreateWithMask來用另一個圖像來遮蔽圖像,而不是使用圖像遮罩。你可以這樣做,以達到與使用圖像蒙板掩蔽圖像時相反的效果。而不是傳遞使用函數CGImageMaskCreate創建的圖像掩碼,而是提供從一個Quartz圖像創建函數創建的圖像。
用作掩碼(但不是Quartz圖像掩碼)的圖像的源樣本作為alpha值操作。圖像樣本值(S):
- 等于1允許在全覆蓋下繪制相應的圖像樣本。
- 等于0塊繪制相應的圖像樣本。
- 大于0和小于1允許用α值繪制相應的圖像樣本。
圖11-8顯示了通過調用函數CGImageCreateWithMask將圖11-6所示的圖像應用于圖11-5所示的圖像而得到的圖像。在這種情況下,假設使用Quartz圖像創建函數(如CGImageCreate)創建圖11-6所示的圖像。將圖11-8與圖11-7進行比較,看看相同的樣本值,當用作圖像樣本而不是圖像掩碼樣本時,實現了相反的效果。
對應于圖像黑色區域的原始圖像中的區域不會在生成的圖像中繪制(圖11-8)。對應于白色區域的區域被涂漆。使用等于掩蔽圖像樣本值的中間α值來繪制對應于掩模中的灰色區域的區域。
用顏色遮蔽圖像
函數CGImageCreateWithMaskingColors通過屏蔽提供給函數的圖像中的一種顏色或一系列顏色來創建圖像。 使用此功能,您可以執行類似于圖11-9所示的色鍵掩碼,或者您可以屏蔽一系列顏色,類似于圖11-11,圖11-12和圖11-13所示。
函數CGImageCreateWithMaskingColors有兩個參數:
- 不是圖像蒙版并且不是將圖像蒙版或蒙版顏色應用于其他圖像的結果的圖像。
- 指定顏色或顏色范圍的顏色組件數組,以便函數在圖像中進行遮罩。
顏色分量數組中的元素數量必須等于圖像顏色空間中顏色分量數量的兩倍。對于顏色空間中的每個顏色分量,提供一個最小值和一個最大值,指定要屏蔽的顏色范圍。要僅遮蔽一種顏色,請將最小值設置為等于最大值。顏色分量數組中的值按以下順序提供:
{min [1],max [1],... min [N],max [N]},其中N是分量的數量。
如果圖像使用整數像素分量,則顏色分量數組中的每個值必須在[0..2 ^ bitsPerComponent - 1]的范圍內。如果圖像使用浮點像素分量,則每個值可以是作為有效顏色分量的任何浮點數。
如果圖像樣本的顏色值在以下范圍內,則不會繪制:
{c [1],... c [N]}
其中min [i] <= c [i] <= max [i] for 1 <= i <= N
在未上漆的樣品下面的任何內容,例如當前填充顏色或其他圖形,顯示通過。
如圖11-10所示,兩只老虎的圖像使用每個分量8位的RGB顏色空間。要掩蔽此圖像中的一系列顏色,您需要在0到255的范圍內提供最小和最大顏色分量值。
清單11-3顯示了一個代碼片段,它設置了一個顏色組件數組,并將該數組提供給函數CGImageCreateWithMaskingColors,以實現圖11-11所示的結果。
// 將光線遮蔽到圖像中的中等棕色顏色
CGImageRef myColorMaskedImage;
const CGFloat myMaskingColors[6] = {124, 255, 68, 222, 0, 165};
myColorMaskedImage = CGImageCreateWithMaskingColors (image,
myMaskingColors);
CGContextDrawImage (context, myContextRect, myColorMaskedImage);
清單11-4顯示了另一個代碼片段,它對圖11-10所示的映像進行操作,得到如圖11-12所示的結果。 此示例屏蔽較暗的顏色范圍。
// 掩蔽后的圖像顏色從深棕色到黑色
CGImageRef myMaskedImage;
const CGFloat myMaskingColors[6] = { 0, 124, 0, 68, 0, 0 };
myColorMaskedImage = CGImageCreateWithMaskingColors (image,
myMaskingColors);
CGContextDrawImage (context, myContextRect, myColorMaskedImage);
您可以屏蔽圖像中的顏色以及設置填充顏色,以實現圖11-13中所示的效果,其中遮蔽區域將替換為填充顏色。 清單11-5顯示了生成如圖11-13所示圖像的代碼片段。
// 遮蔽一系列顏色并設置填充顏色
CGImageRef myMaskedImage;
const CGFloat myMaskingColors[6] = { 0, 124, 0, 68, 0, 0 };
myColorMaskedImage = CGImageCreateWithMaskingColors (image,
myMaskingColors);
CGContextSetRGBFillColor (myContext, 0.6373,0.6373, 0, 1);
CGContextFillRect(context, rect);
CGContextDrawImage(context, rect, myColorMaskedImage);
通過剪切上下文來屏蔽圖像
函數CGContextClipToMask將掩碼映射到矩形中,并將其與圖形上下文的當前剪切區域相交。您提供以下參數:
- 您要剪輯的圖形上下文。
- 應用遮罩的矩形。
- 通過調用函數CGImageMaskCreate創建的圖像掩碼。您可以提供圖像而不是圖像掩碼,以實現與通過提供圖像掩碼獲得的效果相反的效果。圖像必須使用Quartz圖像創建函數創建,但不能是對另一個圖像應用蒙版或蒙版顏色的結果。
所得到的剪裁區域取決于您是否向函數CGContextClipToMask提供圖像掩碼或圖像。如果提供圖像掩碼,則會獲得類似于使用圖像掩碼掩蔽圖像中描述的結果的結果,但圖形上下文被裁剪。如果提供圖像,則圖形上下文將被裁剪,類似于使用圖像掩蔽圖像中所述。
看看圖11-14。假設它是通過調用函數CGImageMaskCreate創建的圖像掩碼,然后掩碼作為參數提供給函數CGContextClipToMask。所得到的上下文允許繪制到黑色區域,不允許繪制到白色區域,并且允許以α-1的S值繪制到灰色區域,其中S是圖像掩模的樣本值。如果使用函數CGContextDrawImage將圖像繪制到剪輯的上下文,您將得到類似于圖11-15所示的結果。
當掩蔽圖像被視為圖像時,得到相反的結果,如圖11-16所示。
使用混合模式與圖像
您可以使用Quartz 2D混合模式(請參閱設置混合模式)來合成兩個圖像,或者在已經繪制到圖形上下文的任何內容上合成圖像。 本節討論在背景圖形上合成圖像。
在背景上合成圖像的一般過程如下:
- 繪制背景。
- 通過使用混合模式常量之一調用函數CGContextSetBlendMode設置混合模式。 (混合模式基于在PDF參考,第四版,1.5版,Adobe Systems,Inc。中定義的模式)
- 通過調用函數CGContextDrawImage在背景上繪制要合成的圖像。
此代碼片段使用“darken”混合模式在背景上合成一個圖像:
CGContextSetBlendMode (myContext, kCGBlendModeDarken);
CGContextDrawImage (myContext, myRect, myImage2);
本節的其余部分使用Quartz提供的每種混合模式,在由圖左側所示的畫矩形組成的背景上繪制圖11-17右側所示的圖像。 在所有情況下,矩形首先被繪制到圖形上下文。 然后,通過調用函數CGContextSetBlendMode設置混合模式,傳遞適當的混合模式常量。 最后,跳線的圖像被繪制到圖形上下文。
Normal Blend Mode
正常混合模式在源圖像樣本上涂覆背景圖像樣本。 正常混合模式是Quartz的默認混合模式。 如果您正在使用另一種混合模式并想要切換到正常混合模式,則只需顯式設置正常混合模式。 您可以通過將常量kCGBlendModeNormal傳遞到函數CGContextSetBlendMode或通過使用函數CGContextRestoreGState恢復圖形狀態(假設先前的圖形狀態使用正常混合模式)來設置正常混合模式。
圖11-18顯示了使用正常混合模式在同一圖中所示的矩形上繪制如圖11-17所示的圖像的結果。 在此示例中,使用alpha值1.0繪制圖像,因此背景完全被圖像遮擋。
Multiply Blend Mode
乘法混合模式將源圖像樣本與背景圖像樣本相乘。 所得圖像中的顏色至少與兩種貢獻的樣品顏色中的任一種一樣暗。
通過將常量kCGBlendModeMultiply傳遞給函數CGContextSetBlendMode,可以指定乘法混合模式。 圖11-19顯示了使用乘法混合模式在同一圖中所示的矩形上繪制圖11-17所示的圖像的結果。
Screen Blend Mode
屏幕混合模式將源圖像樣本的逆與背景圖像樣本的逆相乘,以獲得至少與兩個貢獻樣本顏色中的任一個一樣輕的顏色。
通過將常量kCGBlendModeScreen傳遞給函數CGContextSetBlendMode,可以指定屏幕混合模式。 圖11-20顯示了使用屏幕混合模式在同一圖中所示的矩形上繪制如圖11-17所示的圖像的結果。
Overlay Blend Mode
疊加混合模式根據背景樣本的顏色,將源圖像樣本與背景圖像樣本相乘或進行篩選。 結果是覆蓋現有的圖像樣本,同時保留背景的高光和陰影。 背景顏色與源圖像混合以反映背景的亮度或暗度。
通過將常量kCGBlendModeOverlay傳遞給函數CGContextSetBlendMode來指定覆蓋混合模式。 圖11-21顯示了使用覆蓋混合模式在同一圖中所示的矩形上繪制如圖11-17所示的圖像的結果。
Darken Blend Mode
變暗混合模式通過從源圖像或背景中選擇較暗的樣本來創建復合圖像樣本。比較背景圖像樣本更暗的源圖像樣本替換相應的背景樣本。
通過將常量kCGBlendModeDarken傳遞給函數CGContextSetBlendMode來指定暗混合模式。圖11-22顯示了使用暗混合模式在同一圖中所示的矩形上繪制圖11-17所示的圖像的結果。
Lighten Blend Mode
淡化混合模式通過從源圖像或背景中選擇較淺的樣本來創建復合圖像樣本。 比背景圖像樣本更亮的源圖像樣本替換相應的背景樣本。
通過將常量kCGBlendModeLighten傳遞到函數CGContextSetBlendMode,指定減輕混合模式。 圖11-23顯示了使用淡化混合模式在同一圖中所示的矩形上繪制圖11-17所示的圖像的結果。
Color Dodge Blend Mode
顏色閃避混合模式增亮背景圖像樣本以反映源圖像樣本。 指定黑色的源圖像樣本值保持不變。
通過將常量kCGBlendModeColorDodge傳遞給函數CGContextSetBlendMode,可以指定顏色閃避混合模式。 圖11-24顯示了使用顏色閃避混合模式在同一圖中所示的矩形上繪制如圖11-17所示的圖像的結果。
Color Burn Blend Mode
彩色混合模式使背景圖像樣本變暗以反映源圖像樣本。 指定白色的源圖像樣本值保持不變。
通過將常量kCGBlendModeColorBurn傳遞給函數CGContextSetBlendMode,可以指定顏色混合模式。 圖11-25顯示了使用顏色混合模式在同一圖中所示的矩形上繪制如圖11-17所示的圖像的結果。
Soft Light Blend Mode
柔光混合模式根據源圖像樣本顏色使顏色變暗或變亮。 如果源圖像樣本顏色比50%灰色淺,則背景變亮,類似于躲閃。 如果源圖像樣本顏色比50%灰色深,則背景變暗,類似于燃燒。 如果源圖像樣本顏色等于50%灰色,則背景不變。
等于純黑色或純白色的圖像樣本會產生較暗或較亮的區域,但不會產生純黑色或白色。 整體效果類似于通過在源圖像上照射漫射聚光燈實現的效果。
通過將常量kCGBlendModeSoftLight傳遞給函數CGContextSetBlendMode,可以指定柔光混合模式。 圖11-26顯示了使用柔光混合模式在同一圖中所示的矩形上繪制如圖11-17所示的圖像的結果。
Hard Light Blend Mode
硬光混合模式可以倍增或屏幕顏色,具體取決于源圖像樣本顏色。 如果源圖像樣本顏色比50%灰色淺,則背景被減輕,類似于篩選。 如果源圖像樣本顏色比50%灰色深,則背景變暗,類似于乘法。 如果源圖像樣本顏色等于50%灰色,則源圖像不變。 等于純黑色或純白色的圖像樣本導致純黑色或白色。 整體效果類似于通過在源圖像上照射嚴酷的聚光燈實現的效果。
通過將常量kCGBlendModeHardLight傳遞給函數CGContextSetBlendMode,可以指定硬光混合模式。 圖11-27顯示了使用硬光混合模式在同一圖中所示的矩形上繪制如圖11-17所示的圖像的結果。
Difference Blend Mode
差分混合模式從背景圖像樣本顏色中減去源圖像樣本顏色,或者相反,這取決于哪個樣本具有較大的亮度值。 黑色的源圖像樣本值不產生變化; 白色反轉背景顏色值。
通過將常量kCGBlendModeDifference傳遞給函數CGContextSetBlendMode,可以指定差異混合模式。 圖11-28顯示了使用差異混合模式在同一圖中所示的矩形上繪制如圖11-17所示的圖像的結果。
Exclusion Blend Mode
排除混合模式產生差異混合模式的低對比度版本。 黑色的源圖像樣本值不產生變化; 白色反轉背景顏色值。
可以通過將常量kCGBlendModeExclusion傳遞給函數CGContextSetBlendMode來指定排除混合模式。 圖11-29顯示了使用排除混合模式在同一圖中所示的矩形上繪制如圖11-17所示的圖像的結果。
Hue Blend Mode
色相混合模式使用背景的亮度和飽和度值與源圖像的色調。 通過將常量kCGBlendModeHue傳遞給函數CGContextSetBlendMode,可以指定色調混合模式。 圖11-30顯示了使用色相混合模式在同一圖中所示的矩形上繪制如圖11-17所示的圖像的結果。
Saturation Blend Mode
飽和度混合模式使用背景的亮度和色調值與源圖像的飽和度。 純灰色區域不產生變化。 通過將常量kCGBlendModeSaturation傳遞給函數CGContextSetBlendMode來指定飽和混合模式。 圖11-31顯示了使用飽和混合模式在同一圖中所示的矩形上繪制如圖11-17所示的圖像的結果。
Color Blend Mode
顏色混合模式使用背景的亮度值與源圖像的色調和飽和度值。 此模式保留圖像中的灰度級。 通過將常量kCGBlendModeColor傳遞給函數CGContextSetBlendMode,可以指定顏色混合模式。 圖11-32顯示了使用顏色混合模式在同一圖中所示的矩形上繪制如圖11-17所示的圖像的結果。
Luminosity Blend Mode
亮度混合模式使用背景的色調和飽和度與源圖像的亮度創建與由顏色混合模式創建的效果相反的效果。
你通過傳遞常量kCGBlendModeLuminosity到函數CGContextSetBlendMode指定光度混合模式。 圖11-33顯示了使用光度混合模式在同一圖中所示的矩形上繪制如圖11-17所示的圖像的結果。