Quartz 2D 之Bitmap Images and Image Masks

在Quartz中位圖圖像和圖像掩模更像是初級的。圖像和圖像掩模在Quartz中都是CGImageRef 數(shù)據(jù)類型。在文章的后面你可以了解到很多創(chuàng)建圖像的方法。一些方法需要你提供數(shù)據(jù)提供者或者元數(shù)據(jù)從而提供位圖數(shù)據(jù),一些方法通過從已有的圖想創(chuàng)建位圖或者拷貝或者通過應(yīng)用一個操作的圖像。不管你是怎么創(chuàng)建的位圖,你都可以上下文中繪制位圖。永遠(yuǎn)時刻記著位圖是指定分辨率的位數(shù)組。

可以通過CGImageMaskCreate方法創(chuàng)建一個位圖掩模。應(yīng)用圖像掩模不是唯一的方法來掩模圖形。

About Bitmap Images and Image Masks? 關(guān)于位圖和圖像掩模


一個位圖圖像是像素的數(shù)組集合。每個像素代表圖像中的一個點(diǎn)。JPEG TIFF PNG 圖形文件都是位圖的例子。應(yīng)用程序圖標(biāo)也是位圖。但是位圖僅限于矩形框,但是我們可以使用透明度,使得位圖可以設(shè)計(jì)為不同的形狀。 可以被剪裁,被旋轉(zhuǎn)。

位圖中的每個樣本在指定的顏色空間里包含一個或者多個組分,在增加一個透明度。每個組分可以是1到32位之間的。在Mac OS X中,Quartz 支持浮點(diǎn)數(shù)。

Quartz 也支持圖像掩模。一個掩模是指定了繪制區(qū)域的位圖,而不是顏色。實(shí)際上,圖像掩模就像是一個模板指定頁面上的顏色。Quartz 使用當(dāng)前的顏色繪制圖像掩模。一個圖像掩模有一個1到8位的深度。

Bitmap Image Information 位圖信息

Quartz支持很多圖形格式還有很多流行的數(shù)據(jù)格式。在iOS中,這個格式包括JPEG, GIF, PNG, TIF, ICO, GMP, XBM, and CUR,其他的位圖格式和專用格式需要你指定圖片格式的細(xì)節(jié)以便圖像能夠被正確解釋。提供給方法CGImageCreate的數(shù)據(jù)必須在每個像素上交叉,而不是每個掃描線。Quartz不支持平面數(shù)據(jù)。

本章節(jié),描述了位圖相關(guān)的信息,當(dāng)你使用Quartz圖像(CGImageRef數(shù)據(jù)格式)創(chuàng)建使用時,你將會看到一些圖像創(chuàng)建方法需要你指定一些信息,而有些方法需要你指定這些信息的子集。你需要提供的取決于位圖數(shù)據(jù)的編碼,以及位圖是否代表一個圖像或圖像掩模。

Note:在操作元數(shù)據(jù)時獲得最佳性能,最好使用vlmage框架。你可以使用方法vImageBuffer_InitWithCGImage 把圖像數(shù)據(jù)導(dǎo)入進(jìn)vlmage。

在創(chuàng)建位圖圖像(CGImageRef)Quartz使用一下的信息:

1.A bitmap data source 。位圖數(shù)據(jù)來源,這個可以由Quartz數(shù)據(jù)提供者提供或者圖像來源。Data Management in Quartz 2D 章節(jié)中討論了提供給位圖數(shù)據(jù)的方法。

2.An optional decode array。一個可選的解碼數(shù)組。

3.An interpolation setting。插值設(shè)置。一個布爾值,指定Quartz是否在圖像縮放時使用圖像插值算法。

4.指定如何映射位于圖形上下文的目標(biāo)顏色空間內(nèi)的顏色的渲染意圖,此信息是不需要圖像掩模。參考Setting Rendering Intent

5.dimensions。圖像規(guī)格

6.像素格式,包括了組分的位數(shù),每個像素的位數(shù),每行的字節(jié)數(shù)。

7.對于圖像,顏色空間和位圖布局(Color Spaces and Bitmap Layout))信息來描述阿爾法的位置,以及位圖是否使用浮點(diǎn)值。圖像掩模不需要此信息。

Decode Array

一個可選的解碼數(shù)組在不飽和圖像或者反轉(zhuǎn)顏色時可以將一些顏色映射到其他顏色中。這個數(shù)組包含了一對數(shù)值,為顏色的每個組分服務(wù)。當(dāng)Quartz渲染圖像時,它使用了線性變換把原始的組分值映射到接近目的顏色空間的指定設(shè)置變化范圍內(nèi)。例如,由RGB顏色組成的圖像的解碼數(shù)組,包含6個入口,紅綠藍(lán)各一對。

Pixel Format

像素格式包含以下信息:

① Bits per component。每個組分的位數(shù)。指定了一個像素中每個獨(dú)立的顏色組分的位數(shù)。在圖像掩模中,這個值是源像素的位數(shù)。例如,如果源映像是一個8位掩模,請指定每一個組件的8位。

② Bits per pixel。每個像素的位數(shù),這是源像素的總位數(shù)。這個值最少是咩組分的位數(shù) * 每個像素的組分?jǐn)?shù)。

③ Bytes per row 。每行字節(jié)數(shù)。圖像中每行水平行的字節(jié)數(shù)

Color Spaces and Bitmap Layout

為了保證Quartz能正確解釋每個像素的位數(shù),你必須制定:

① 是否一個位圖包含透明度。Quartz支持RGB CMYK 和灰色顏色空間。它也支持透明度。盡管在所有的位圖圖像格式中透明度信息是不支持的。

② 對于有透明度組分的位圖。透明度組分是否已經(jīng)被前乘。前乘提高了渲染效率減少了每個顏色組分和透明度的相乘。例如,在RGB顏色空間中進(jìn)行,與透明度前乘消除了(紅色、綠色 、藍(lán)色 與透明度的相乘)。

③ 樣本點(diǎn)的格式--整形或者浮點(diǎn)數(shù)。

當(dāng)你使用方法CGImageCreate創(chuàng)建一個圖像,你需要提供一個參數(shù)指針和CGImageBitmapInfo格式的類型(指定layout信息)。下列的常量指定了透明度的位置和顏色組分是否被前乘。

kCGImageAlphaLast:存儲在 每個像素里最不重要的位數(shù) 如RGBA。

kCGImageAlphaFirst:存儲在最重要的位數(shù)。如ARGB。

kCGImageAlphaPremultipliedLast:存儲在最不要重要的位數(shù),顏色組分已經(jīng)和透明度前乘。

kCGImageAlphaPremultipliedFirst:存儲在最重要的位數(shù),顏色組分已經(jīng)和透明度前乘。

kCGImageAlphaNoneSkipLast:沒有透明度。最不重要的位數(shù)被忽略

kCGImageAlphaNoneSkipFirst:沒有透明度。最重要的位數(shù)被忽略

kCGImageAlphaNone: 等同于kCGImageAlphaNoneSkipLast

你可以使用kCGBitmapFloatComponents 聲明位圖為浮點(diǎn)值。在邏輯上采用或。 比如每個像素128位的浮點(diǎn)可以使用前程透明度,如:kCGImageAlphaPremultipliedLast|kCGBitmapFloatComponents

圖11-2 可視化描述了在CMYK和RGB顏色空間中像素代表了什么,16 和32位的格式。32位像素采用8位每組分。16為像素采用5位每組分。Quartz 2D也支持128位的,下圖沒有展示。

Creating Images 創(chuàng)建圖像

表中例舉了Quartz提供創(chuàng)建CGImage對象的方法。創(chuàng)建的方法取決于圖像源數(shù)據(jù)。最靈活的方法是 CGImageCreate。它可以創(chuàng)建來自于任意一種數(shù)據(jù)源的。然而大部分你使用的復(fù)雜功能你必須指定所有的位圖信息。在使用這個方法的時候,你必須對Bitmap Image Information.特別熟悉。

如果你從標(biāo)準(zhǔn)的數(shù)據(jù)格式 PNG 或者 JPEG創(chuàng)建一個CGImage對象,最簡單的辦法就是 調(diào)用方法CGImageSourceCreateWithURL創(chuàng)建一個圖像源,然后調(diào)用方法CGImageSourceCreateImageAtIndex,指定下標(biāo)。

如果你繪制在位圖上下文上,想捕捉,調(diào)用方法CGBitmapContextCreateImage
。

一些方法是對現(xiàn)有圖像操作的實(shí)用工具??梢詣?chuàng)建一個副本,創(chuàng)建一個縮略圖,或者從一個較大的圖截取一部分。不管你創(chuàng)建CGImage對象的方式,你使用CGContextDrawImage方法繪制在圖形上下文上。永遠(yuǎn)記住CGImage是不可變的。當(dāng)你不需要一個CGImage對象時,調(diào)用方法CGImageRelease釋放掉。

以下章節(jié)將討論:

? ? A subimage from an existing image 來自現(xiàn)有圖像的子圖像

?? An image from a bitmap graphics context 來自位圖上下文的圖像

你可以參考的信息:

Data Management in Quartz 2Ddiscusses how to read and write image data.

CGImage Reference,CGImageSource Reference, andCGBitmapContext Referencefor further information on the functions listed inTable 11-1and their parameters.

Creating an Image From Part of a Larger Image
方法CGImageCreateWithImageInRect可以幫助你創(chuàng)建一個子圖像從已經(jīng)存在的圖像。圖11-3說明提取了字母A 通過一個矩形框指定A的位置。

使用方法CGImageCreateWithImageInRect返回的圖像保留了對原圖像的引用,意味著調(diào)用完這個方法后需要釋放掉源圖像

11-4 展示了 大圖截取為小圖,然后小圖繪制在一個大的矩形框中。

?代碼片段:

Creating an Image from a Bitmap Graphics Context 從位圖上下文中創(chuàng)建一個圖像

從已經(jīng)存在的位圖上下文創(chuàng)建一個圖像的方法是調(diào)用 CGBitmapContextCreateImage。這個方法返回的CGImage是一個拷貝的操作,因此后續(xù)的位圖上下文的變化不會影響返回的CGImage的內(nèi)容。

Creating an Image Mask 創(chuàng)建一個圖像掩模

位圖掩模決定了顏色是如何傳輸?shù)模皇穷伾绾伪皇褂玫?。圖像掩模誰1,2,4,8位每組分。對于1位掩模,樣本值1 就代表禁用當(dāng)前的填充顏色,0 代表被繪制在上下文時代表的顏色。對于2,4,或者8位掩模代表灰度值,每個組分映射到范圍0 ~1,使用下面的公式:

例如,一個4位掩模有值的范圍從0到1的1 / 15的增量。當(dāng)一個8位掩模樣本值縮小到0.7時,顏色被繪制時,透明度為 1-MaskSampleValue,為0.3.

創(chuàng)建一個位圖掩模使用方法CGImageMaskCreate,需要提供位圖圖像信息。這和創(chuàng)建一個圖像需要提供的信息是一樣的,除了你不提供顏色空間信息或者渲染意圖。

Masking Images 掩模圖像

掩模技術(shù)通過控制圖像哪些部分需要繪制從而實(shí)現(xiàn)有趣的效果。

1.可以使用一個圖像作為圖像掩模

2.使用顏色來掩蓋圖像的部分,其中包括被稱為色度摳像的技術(shù)

3.將圖形上下文剪輯到圖像或圖像掩模上

Masking an Image with an Image Mask?? 使用圖像掩模掩模圖像

CGImageCreateWithMask這個方法返回了一個圖像被用來掩模。這個方法需要兩個參數(shù):

??????? 1.你需要被掩模的圖像。這個圖像不能是一個掩模圖像,或者有掩蓋顏色。

? ? ? ? 2.CGImageMaskCreate,通過這個方法創(chuàng)建一個圖像掩模。

? 樣本值和透明度是相反的。1 代表著禁止,0代表可以覆蓋。

11-5 原圖

11-6 展示了使用方法CGImageMaskCreate.創(chuàng)建掩模。

the result :白色區(qū)域不繪制,灰色區(qū)域透明度 =? 1- s

Masking an Image with an Image 使用圖像

CGImageMaskCreate,使用這個方法,如果還是使用之前的方法CGImageCreateWithMask,使用圖像掩模效果是這樣的,

同樣的樣本值,在被用作圖像樣本和掩模樣本的時候效果是截然不同的。

Masking an Image with Color 用顏色掩蔽圖像

CGImageCreateWithMaskingColors 這個方法創(chuàng)建了一個掩模通過一個顏色或者一系列顏色。使用這個方法你可以實(shí)現(xiàn)chroma key masking 色度摳像。

需要兩個參數(shù):一個非掩模的圖像,一個顏色組分的數(shù)組:指定顏色變化。

在顏色分量數(shù)組中的元素的數(shù)目必須等于圖像的顏色空間的顏色分量的兩倍。對于顏色空間中的每個顏色組件,提供一個最小值和一個指定顏色的范圍的最大值。如果只是掩蓋一個顏色,設(shè)置最小值等于最大值。顏色分量數(shù)組中的值按以下順序提供:

{min[1], max[1], ... min[N], max[N]}, N代表 組分的數(shù)量。

對于整形來說,顏色組分?jǐn)?shù)組的每個值的變化范圍在[0 .. 2^bitsPerComponent - 1]。浮點(diǎn)數(shù)可以是任意的有效的顏色組分。

實(shí)現(xiàn)效果

代碼片段:

另一種:

代碼片段:


也可以替代填充顏色:

代碼片段:

Masking an Image by Clipping the Context 通過裁剪上下文實(shí)現(xiàn)掩模。

CGContextClipToMask這個方法,使用矩形裁剪區(qū)域與上下文相交,你可以提供下面的參數(shù):

1. 你要裁剪的上下文

2.你要掩模的矩形框

3.CGImageMaskCreate 通過這個方法創(chuàng)建掩模。你需要提供一個圖像替代圖像掩模,圖像掩模會實(shí)現(xiàn)相反的效果。圖像必須被Quartz創(chuàng)建方法創(chuàng)建,但是它 不能是把圖像或者遮蓋顏色應(yīng)用到另一個圖像的結(jié)果。

裁剪區(qū)域取決于你提供的圖象掩?;蛘咄ㄟ^CGContextClipToMask創(chuàng)建的圖像。當(dāng)你提供圖像掩模時,你將會得到和Masking an Image with an Image Mask,描述里相同的效果,除了上下文被裁剪。當(dāng)你提供一個圖像,被裁剪的上下文和Masking an Image with an Image.描述的是類似的效果。

上圖如果是作為圖像掩模,通過方法CGImagMaskCreate創(chuàng)建,然后提供給CGContextclipToMask作為參數(shù),允許繪制黑色 ,不允許繪制白色,灰色透明度為1-s,s 為樣本值,然后調(diào)用方法CGContextDrawImage,你會得到和11-15鄉(xiāng)土的結(jié)果。

如果 不是圖像掩模,是圖像,結(jié)果是相反的。如圖:

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

你可以使用Quartz 2D圖像混合模式混合多個圖片或者把一個圖像覆蓋在上下文中上。本節(jié)討論合成圖像覆蓋在背景圖。

合成圖像背景的步驟如下:

1.繪制背景

2.CGContextSetBlendMode 調(diào)用這個方法選擇合適模式。

3.繪制圖像在背景上 通過調(diào)用CGContextDrawImage。

示例:

Normal Blend Mode:Quartz中默認(rèn)的模式,當(dāng)你當(dāng)前使用的是其他模式,你可以明確設(shè)置為默認(rèn)模式。有兩種方式:傳遞常量kCGBlendModeNormal為正常模式給方法CGContextSetBlendMode,或者保存圖形狀態(tài)(假定之前的圖形狀態(tài)使用的是正常模式)使用CGContextRestoreGState
。圖11-18中前景透明度為1.0,所以背景被完全覆蓋。

Multiply Blend Mode:疊加的混合模式。最終的圖像顏色和兩個貢獻(xiàn)者的黑色一樣。調(diào)用方法CGContextSetBlendMode,傳遞常量kCGBlendModeMultiply,11-19展示了疊加模式,圖片覆蓋在矩形框上。

Screen Blend Mode:背景圖與前景圖的反轉(zhuǎn),顏色和兩個貢獻(xiàn)者的顏色一樣輕。調(diào)用方法CGContextSetBlendMode,傳遞常量kCGBlendModeScreen。

Overlay Blend Mode:疊加混合模式或復(fù)合或過濾源圖像樣本使用背景圖像樣本,這取決于背景樣本的顏色。結(jié)果是覆蓋現(xiàn)有的圖片樣本,保留亮點(diǎn)和陰影背景。背景色與源圖像混合,已反應(yīng)背景的亮度和暗度。

Darken Blend Mode:變暗混合模式創(chuàng)建復(fù)合圖像樣本選擇深色樣品從源圖像或背景。源圖像樣本,是比背景圖像樣本顏色較深的,取代了相應(yīng)的背景樣本。kCGBlendModeDarken

Lighten Blend Mode:減輕混合模式創(chuàng)建復(fù)合圖像樣本,通過選擇較輕的樣品從源圖像或背景。源圖像樣本,是比背景圖像樣本更輕,取代了相應(yīng)的背景樣本。常量:kCGBlendModeLighten。

Color Dodge Blend Mode:色彩混合模式變亮背景圖像樣本反映源圖像樣本。指定黑色的源圖像樣本值保持不變。常量:kCGBlendModeColorDodge

Color Burn Blend Mode:色彩混合模式變暗背景圖像樣本反映源圖像樣本。指定白色保持不變的源圖像樣本值。常量:

Soft Light Blend Mode:柔光模式可以變暗或變亮的顏色,根據(jù)源圖像樣本的顏色。如果源圖像樣本的顏色比50%灰色亮,背景的淡化,類似于Color Dodge Blend Mode。如果源圖像樣本的顏色比50%灰色暗,背景變暗,類似Color Burn Blend Mode。如果源圖像樣本顏色等于50%灰度,背景不改變。常量:kCGBlendModeHardLight;

Difference Blend Mode:不同的混合模式的源圖像中減去樣品顏色從背景圖像樣本的顏色,或者相反,這取決于樣品的亮度值更大。原圖樣式黑色的沒有變化。常量:kCGBlendModeDifference

Exclusion Blend Mode:排除混合模式產(chǎn)生的差分混合模式的一個較低的Difference Blend Mode版本。常量:kCGBlendModeExclusion

Hue Blend Mode:調(diào)混合模式使用的背景的亮度和飽和度值的源圖像的色調(diào)。常量:kCGBlendModeHue。

Saturation Blend Mode:飽和混合模式使用的是源圖像的飽和度和背景的亮度。常量:kCGBlendModeSaturation。

Color Blend Mode:顏色混合模式使用源圖像的飽和度和背景的亮度。這種模式保留了圖像中的灰度級。常量:kCGBlendModeColor。

Luminosity Blend Mode:光度混合模式使用的是背景的飽和度和亮度和源圖像的亮度達(dá)到一種和Color Blend Mode相反的效果。常量:kCGBlendModeLuminosity

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 位圖圖像和圖像蒙板就像Quartz中的任何圖形圖元。 Quartz中的圖像和圖像蒙板都由CGImageRef數(shù)據(jù)類...
    權(quán)宜平和閱讀 1,830評論 0 3
  • 本文轉(zhuǎn)載自:http://southpeak.github.io/2015/01/05/quartz2d-11/ ...
    idiot_lin閱讀 1,046評論 1 1
  • 兔子看著像煤球一樣的小奶貓,扯了扯長長的耳朵,用咬掉半截的胡蘿卜碰了碰。 小奶貓緊閉著眼睛,絲毫沒有反應(yīng)。 “這么...
    淺囈七閱讀 482評論 3 3
  • 1、 在我沒有生娃前, 偶然知道汪培珽《喂故事書長大的孩子》,了解閱讀對孩子的重要性,就堅(jiān)持給外甥女買繪本。如今,...
    半朵花_c0b8閱讀 229評論 1 2

友情鏈接更多精彩內(nèi)容