Paths

路徑定義一個或多個形狀或子路徑。 子路徑可以由直線匠璧,曲線或兩者組成桐款。 它可以打開或關閉。 子路徑可以是簡單的形狀夷恍,例如線魔眨,圓,矩形或星形酿雪,或更復雜的形狀遏暴,例如山脈的輪廓或抽象涂鴉。 圖3-1顯示了您可以創(chuàng)建的一些路徑指黎。 直線(在圖的左上方)是虛線; 線條也可以是實心的朋凉。 波形路徑(在中間頂部)由幾條曲線組成并且是開放路徑。 同心圓被填充醋安,但不被描邊杂彭。 加利福尼亞州是一條封閉的路徑墓毒,由許多曲線和線組成,路徑既描邊(stroked)又填充盖灸。 星星說明了兩種填充路徑的選項蚁鳖,您將在本章后面閱讀。

3-1 Quartz支持基于路徑的繪圖

在本章中赁炎,您將了解構(gòu)成路徑的構(gòu)建塊醉箕,如何描繪和繪制路徑以及影響路徑外觀的參數(shù)。

路徑創(chuàng)建和路徑繪畫

路徑創(chuàng)建和路徑繪制是單獨的任務徙垫。 首先創(chuàng)建一個路徑讥裤。 當你想渲染一個路徑時,你要求Quartz繪制它姻报。 如圖3-1所示己英,您可以選擇劃出路徑,填充路徑吴旋,或者同時劃出和填充路徑损肛。 您還可以使用路徑來限制路徑邊界內(nèi)的其他對象的繪制,實際上是剪裁區(qū)域荣瑟。

圖3-2顯示了已繪制并包含兩個子路徑的路徑治拿。 左邊的子路徑是矩形,右邊的子路徑是由直線和曲線組成的抽象形狀笆焰。 每個子路徑都已填充劫谅,其輪廓已劃線。

3-2 包含兩個形狀或子路徑的路徑

圖3-3顯示了獨立繪制的多條路徑嚷掠。 每個路徑包含隨機生成的曲線捏检,其中一些填充和其他描邊。 繪圖通過剪裁區(qū)域限制為圓形區(qū)域不皆。

3-3 剪切區(qū)域約束繪圖

構(gòu)件塊

子路徑由線贯城,弧和曲線構(gòu)成。 Quartz還提供了方便的功能霹娄,通過單個函數(shù)調(diào)用來添加矩形和橢圓能犯。 點也是路徑的基本構(gòu)建塊,因為點定義了形狀的開始和結(jié)束位置项棠。

Points

點是指定用戶空間中的位置的x和y坐標。 您可以調(diào)用函數(shù)CGContextMoveToPoint以指定新子路徑的起始位置挎峦。 Quartz跟蹤當前點香追,這是用于路徑構(gòu)造的最后一個位置。 例如坦胶,如果調(diào)用函數(shù)CGContextMoveToPoint在(10,10)設置位置透典,則將當前點移動到(10,10)晴楔。 如果然后繪制水平線50個單位長,線上的最后一個點峭咒,即(60,10)税弃,變?yōu)楫斍包c。 線凑队,弧和曲線始終從當前點開始繪制则果。

大多數(shù)時候你通過傳遞給Quartz函數(shù)指定一個點,兩個浮點值來指定x和y坐標漩氨。 一些函數(shù)要求你傳遞一個CGPoint數(shù)據(jù)結(jié)構(gòu)西壮,它保存兩個浮點值。

Lines

線由其端點定義叫惊。 它的始點始終假定為當前點款青,因此在創(chuàng)建線時,只指定其端點霍狰。 您可以使用函數(shù)CGContextAddLineToPoint將單個行追加到子路徑抡草。

您可以通過調(diào)用函數(shù)CGContextAddLines將一系列連接的行添加到路徑。 你傳遞這個函數(shù)的點數(shù)組蔗坯。 第一點必須是第一行的起點; 其余點是端點康震。 Quartz在第一個點開始新的子路徑,并將直線段連接到每個端點步悠。

Arcs

圓弧是圓弧段签杈。 Quartz提供了兩個創(chuàng)建弧線的函數(shù)。 函數(shù)CGContextAddArc從圓圈創(chuàng)建一個曲線段鼎兽。 指定圓的中心答姥,半徑和徑向角(以弧度表示)。 您可以通過指定2 pi的徑向角度創(chuàng)建一個完整的圓谚咬。 圖3-4顯示了獨立繪制的多個路徑鹦付。 每個路徑包含隨機生成的圓; 一些填充和其他描邊。

3-4 多路徑; 每個路徑包含隨機生成的圓

函數(shù)CGContextAddArcToPoint是理想的择卦,當你想要圓角的矩形敲长。 Quartz使用您提供的端點創(chuàng)建兩條切線。 您還提供了Quartz切割圓弧的圓的半徑秉继。 弧的中心點是兩個半徑的交點祈噪,每個半徑垂直于兩條切線中的一條。 圓弧的每個端點是切線之一上的切點尚辑,如圖3-5所示辑鲤。 圓的紅色部分是實際繪制的。

3-5 用兩條切線和半徑定義圓弧

如果當前路徑已經(jīng)包含子路徑杠茬,Quartz將從當前點到弧的起點添加一條直線段月褥。 如果當前路徑為空弛随,Quartz將在弧的起點處創(chuàng)建一個新的子路徑,而不添加初始直線段宁赤。

Curves

二次和三次貝塞爾曲線是可以指定任何數(shù)量的有趣曲線形狀的代數(shù)曲線舀透。 通過對起點和終點以及一個或多個控制點應用多項式公式來計算這些曲線上的點。 以這種方式定義的形狀是矢量圖形的基礎决左。 公式比位數(shù)組更緊湊地存儲愕够,并且具有可以以任何分辨率重新創(chuàng)建曲線的優(yōu)點。
圖3-6顯示了通過獨立繪制多個路徑創(chuàng)建的各種曲線哆窿。 每個路徑包含隨機生成的曲線; 一些填充和其他描邊链烈。

3-6 多路徑; 每個路徑包含隨機生成的曲線

提供二次和三次貝塞爾曲線的多項式公式以及關于如何從公式生成曲線的細節(jié),在描述計算機圖形的許多數(shù)學文本和在線資源中討論挚躯。 這里不討論這些細節(jié)强衡。

您使用函數(shù)CGContextAddCurveToPoint從當前點附加一個三次貝塞爾曲線,使用控制點和您指定的端點码荔。 圖3-7顯示了從圖中所示的當前點漩勤,控制點和終點產(chǎn)生的三次貝塞爾曲線。 兩個控制點的位置確定曲線的幾何形狀缩搅。 如果控制點都在起點和終點之上越败,則曲線向上拱起。 如果控制點都在起點和終點以下硼瓣,則曲線向下彎曲究飞。

3-7 三次貝塞爾曲線使用兩個控制點

您可以通過調(diào)用函數(shù)CGContextAddQuadCurveToPoint,并指定控制點和端點堂鲤,從當前點追加二次Bézier曲線亿傅。 圖3-8顯示了使用相同的端點但是使用不同的控制點產(chǎn)生的兩條曲線。 控制點確定曲線彎曲的方向瘟栖。 使用二次Bézier曲線創(chuàng)建盡可能多的有趣形狀是不可能的葵擎,因為二次曲線只使用一個控制點。 例如半哟,不能使用單個控制點創(chuàng)建交叉酬滤。

3-8 二次Bézier曲線使用一個控制點
Closing a Subpath

要關閉當前子路徑,應用程序應調(diào)用CGContextClosePath寓涨。 此函數(shù)將從當前點到子路徑的起始點添加一個線段盯串,并關閉子路徑。 在子路徑起點處結(jié)束的線戒良,弧和曲線實際上不關閉子路徑体捏。 您必須顯式調(diào)用CGContextClosePath以關閉子路徑。

一些Quartz函數(shù)將路徑的子路徑視為由應用程序關閉。 這些命令處理每個子路徑译打,就像您的應用程序調(diào)用CGContextClosePath關閉它,隱式地添加一個線段到子路徑的起始點拇颅。

關閉子路徑后奏司,如果您的應用程序進行額外的調(diào)用以向路徑添加線,弧或曲線樟插,Quartz將從您剛關閉的子路徑的起點開始新的子路徑韵洋。

Ellipses

橢圓本質(zhì)上是一個被擠壓的圓。 通過定義兩個聚焦點黄锤,然后繪制所有位于一定距離處的點搪缨,從而將從橢圓上的任何點到一個焦點的距離與從該相同點到另一個焦點的距離相加總是相同的值來創(chuàng)建一個 。 圖3-9顯示了獨立繪制的多條路徑鸵熟。 每個路徑包含隨機生成的橢圓; 一些填充和其他描邊副编。

3-9 多路徑; 每個路徑包含隨機生成的橢圓

您可以通過調(diào)用函數(shù)CGContextAddEllipseInRect將橢圓添加到當前路徑。 您提供了一個定義橢圓邊界的矩形流强。 Quartz使用一系列Bézier曲線近似橢圓痹届。 橢圓的中心是矩形的中心。 如果矩形的寬度和高度相等(即打月,正方形)队腐,則橢圓是圓形的,半徑等于矩形的寬度(或高度)的一半奏篙。 如果矩形的寬度和高度不相等柴淘,則它們定義橢圓的長軸和短軸。

添加到路徑的橢圓以移動到操作開始秘通,并以閉合子路徑操作結(jié)束为严,所有移動以順時針方向定向。

Rectangles

您可以通過調(diào)用函數(shù)CGContextAddRect將矩形添加到當前路徑充易。 您提供了一個包含矩形的原點及其寬度和高度的CGRect結(jié)構(gòu)梗脾。

添加到路徑的矩形以移動到操作開始,并以閉合子路徑操作結(jié)束盹靴,所有移動以逆時針方向定向炸茧。

您可以通過調(diào)用函數(shù)CGContextAddRects并提供一個CGRect結(jié)構(gòu)數(shù)組來向當前路徑添加許多矩形。 圖3-10顯示了獨立繪制的多條路徑稿静。 每個路徑包含一個隨機生成的矩形; 一些填充和其他描邊梭冠。

3-10 多路徑; 每個路徑包含隨機生成的矩形

創(chuàng)建路徑

當你想在圖形上下文中構(gòu)造一個路徑時,你通過調(diào)用函數(shù)CGContextBeginPath來發(fā)送Quartz信號改备。 接下來控漠,通過調(diào)用函數(shù)CGContextMoveToPoint,為路徑中的第一個形狀或子路徑設置起點。 建立第一個點后盐捷,您可以向路徑中添加線偶翅,弧和曲線,并記住以下幾點:

  • 在開始新路徑之前碉渡,請調(diào)用函數(shù)CGContextBeginPath聚谁。
  • 從當前點開始繪制線,弧和曲線滞诺。 空路徑?jīng)]有當前點; 您必須調(diào)用CGContextMoveToPoint以設置第一個子路徑的起點或調(diào)用一個為您隱式執(zhí)行此操作的便利函數(shù)形导。
  • 當要關閉某個路徑中的當前子路徑時,請調(diào)用函數(shù)CGContextClosePath將段連接到子路徑的起始點习霹。 后續(xù)路徑調(diào)用開始一個新的子路徑朵耕,即使您沒有顯式設置新的起點。
  • 當繪制弧時淋叶,Quartz在當前點和弧的起點之間繪制一條線撑蚌。
  • 添加橢圓和矩形的Quartz例程向路徑中添加一個新的封閉子路徑书聚。
  • 您必須調(diào)用繪制函數(shù)來填充或描邊路徑鹉胖,因為創(chuàng)建路徑不會繪制路徑悲没。 有關詳細信息,請參閱繪制路徑形娇。

繪制路徑后锰霜,將從圖形上下文中刷新。 你可能不想失去你的路徑這么容易桐早,特別是如果它描繪了一個復雜的場景癣缅,你想一次又一次使用。 因此哄酝,Quartz為創(chuàng)建可重用路徑提供了兩種數(shù)據(jù)類型:CGPathRef和CGMutablePathRef友存。 您可以調(diào)用函數(shù)CGPathCreateMutable創(chuàng)建一個可變的CGPath對象,您可以添加線陶衅,弧屡立,曲線和矩形。 Quartz提供了一組與“構(gòu)件塊”中討論的功能并行的CGPath函數(shù)搀军。 路徑函數(shù)對CGPath對象而不是圖形上下文進行操作膨俐。 這些功能是:

  • CGPathCreateMutable,它替換了CGContextBeginPath
  • CGPathMoveToPoint罩句,它替換CGContextMoveToPoint
  • CGPathAddLineToPoint焚刺,它替換CGContextAddLineToPoint
  • CGPathAddCurveToPoint,它替換CGContextAddCurveToPoint
  • CGPathAddEllipseInRect门烂,它替換CGContextAddEllipseInRect
  • CGPathAddArc乳愉,它替換CGContextAddArc
  • CGPathAddRect兄淫,它將替換CGContextAddRect
  • CGPathCloseSubpath,它替換CGContextClosePath

有關路徑函數(shù)的完整列表蔓姚,請參閱Quartz 2D Reference Collection捕虽。

當您想將路徑附加到圖形上下文時,可以調(diào)用函數(shù)CGContextAddPath坡脐。 路徑停留在圖形上下文中薯鳍,直到Quartz繪制它。 您可以通過調(diào)用CGContextAddPath再次添加路徑挨措。

注:您可以通過調(diào)用函數(shù)CGContextReplacePathWithStrokedPath,將圖形上下文中的路徑替換為路徑的描邊版本崩溪。

繪畫路徑

您可以通過描邊或填充或兩者來繪制當前路徑浅役。描邊畫一條跨越路徑的線。 填充繪制路徑中包含的區(qū)域伶唯。 Quartz有一些函數(shù)可以讓你描繪一個路徑觉既,填充一個路徑,或者描邊和填充一個路徑乳幸。 描邊線(寬度瞪讼,顏色等),填充顏色和Quartz用于計算填充區(qū)域的方法的特性都是圖形狀態(tài)的一部分(請參見圖形狀態(tài))粹断。

Parameters That Affect Stroking

您可以通過修改表3-1中列出的參數(shù)來影響路徑的描邊符欠。 這些參數(shù)是圖形狀態(tài)的一部分,這意味著為參數(shù)設置的值將影響所有后續(xù)的描邊瓶埋,直到將參數(shù)設置為另一個值希柿。

影響Quartz如何描述當前路徑的參數(shù)

線寬是線的總寬度,以用戶空間的單位表示养筒。 線跨過路徑曾撤,在任一側(cè)具有一半的總寬度。

線連接指定Quartz如何繪制連接的線段之間的連接晕粪。 Quartz支持表3-2中描述的線連接樣式挤悉。 默認樣式為miter join。

線連接樣式

線條帽指定CGContextStrokePath用于繪制線的端點的方法巫湘。 Quartz支持表3-3中描述的線帽樣式装悲。 默認樣式為對接帽。

線帽樣式

閉合子路徑將開始點視為連接的線段之間的連接點; 使用所選的線連接方法渲染起點尚氛。 相反衅斩,如果通過添加連接到起點的線段來關閉路徑,則使用所選的line-cap方法繪制路徑的兩端怠褐。

線圖案允許您沿著描邊路徑繪制分段線畏梆。 通過將虛線數(shù)組和虛線階段指定為CGContextSetLineDash的參數(shù),可以控制沿線的虛線段的大小和位置:

void CGContextSetLineDash (
    CGContextRef ctx,
    CGFloat phase,
    const CGFloat lengths[],
    size_t count
);

length參數(shù)的元素指定了破折號的寬度,在線的著色和未涂漆段之間交替奠涌。 phase參數(shù)指定破折號模式的起點宪巨。 圖3-11顯示了一些行破折號模式。

3-11 線破折號模式的示例

筆畫顏色空間確定了Quartz對筆觸顏色值的解釋方式溜畅。 您還可以指定封裝顏色和顏色空間的Quartz顏色(CGColorRef數(shù)據(jù)類型)捏卓。 有關設置顏色空間和顏色的詳細信息,請參閱顏色和顏色空間慈格。

Functions for Stroking a Path

Quartz提供了表3-4中顯示的用于描畫當前路徑的函數(shù)怠晴。 一些是用于描邊矩形或橢圓的便利函數(shù)。

描邊路徑的函數(shù)

函數(shù)CGContextStrokeLineSegments等價于以下代碼:

CGContextBeginPath (context);
for (k = 0; k < count; k += 2) {
    CGContextMoveToPoint(context, s[k].x, s[k].y);
    CGContextAddLineToPoint(context, s[k+1].x, s[k+1].y);
}
CGContextStrokePath(context);

當您調(diào)用CGContextStrokeLineSegments時浴捆,您將線段指定為一個點數(shù)組蒜田,組織為對。 每對包括線段的起點选泻,后面是線段的終點冲粤。 例如,陣列中的第一點指定第一行的開始位置页眯,第二點指定第一行的結(jié)束位置梯捕,第三點指定第二行的開始位置,等等窝撵。

Filling a Path

當你填充當前路徑時傀顾,Quartz的行為就像路徑中包含的每個子路徑都被關閉一樣。然后使用這些閉合的子路徑并計算要填充的像素碌奉。有兩種方法可以計算填充面積锣笨。簡單路徑(如橢圓形和矩形)具有明確定義的區(qū)域。但是道批,如果路徑由重疊段組成错英,或者路徑包含多個子路徑,例如圖3-12中所示的同心圓隆豹,則有兩個規(guī)則可用于確定填充區(qū)域椭岩。

默認填充規(guī)則稱為非零匝數(shù)規(guī)則。要確定是否應該繪制特定點璃赡,請從該點開始判哥,繪制超出圖形邊界的線。從計數(shù)0開始碉考,每當路徑段從左到右穿過該線時將計數(shù)加1塌计,并且每當路徑段從右到左穿過該線時減1。如果結(jié)果為0侯谁,則該點不被繪制锌仅。否則章钾,點被繪。繪制路徑段的方向會影響結(jié)果热芹。圖3-12顯示了使用非零匝數(shù)規(guī)則填充的兩組內(nèi)圓和外圓贱傀。當在相同方向繪制每個圓時,填充兩個圓伊脓。當在相反方向繪制圓時府寒,內(nèi)圓不被填充。

您可以選擇使用偶數(shù)規(guī)則报腔。要確定是否應該繪制特定點株搔,請從該點開始,繪制超出圖形邊界的線纯蛾。計算線路交叉的路徑段數(shù)纤房。如果結(jié)果是奇數(shù),點被繪茅撞。如果結(jié)果是偶數(shù),點不繪巨朦。繪制路徑段的方向不會影響結(jié)果米丘。如圖3-12所示,每個圓圈繪制的方向無關緊要糊啡,填充將始終如圖所示拄查。

3-12 使用不同的填充規(guī)則填充的同心圓

Quartz提供了表3-5中顯示的用于填充當前路徑的函數(shù)。 一些是用于描邊矩形或橢圓的便利函數(shù)棚蓄。

填充路徑的函數(shù)
Setting Blend Modes

混合模式指定Quartz如何在背景上應用涂料堕扶。 Quartz默認使用正常混合模式梭依,它使用以下公式將前景繪制與背景繪制相結(jié)合:
result = (alpha * foreground) + (1 - alpha) * background

顏色和顏色空間提供了顏色的alpha分量的詳細討論稍算,它指定了顏色的不透明度。對于本節(jié)中的示例役拴,您可以假設顏色完全不透明(alpha值= 1.0)糊探。對于不透明顏色,當使用正澈尤颍混合模式繪制時科平,在背景上繪制的任何內(nèi)容都會遮蔽背景。

您可以通過調(diào)用函數(shù)CGContextSetBlendMode設置混合模式以實現(xiàn)各種效果姜性,傳遞適當?shù)幕旌夏J匠A康苫邸U堄涀。旌夏J绞菆D形狀態(tài)的一部分部念。如果在更改混合模式之前使用函數(shù)CGContextSaveGState弃酌,則調(diào)用函數(shù)CGContextRestoreGState會將混合模式重置為正常氨菇。

本節(jié)的其余部分顯示在圖3-14所示的矩形上繪制如圖3-13所示的矩形的結(jié)果。在每種情況下(圖3-15到圖3-30)矢腻,使用正趁偶荩混合模式繪制背景矩形。然后通過用適當?shù)某?shù)調(diào)用函數(shù)CGContextSetBlendMode來改變混合模式多柑。最后奶是,繪制前景矩形。

3-13 在前景繪的長方形
3-14 在背景中繪的長方形

注:您也可以使用混合模式來合成兩個圖像竣灌,或者在已經(jīng)繪制到圖形上下文的任何內(nèi)容上合成圖像聂沙。 將混合模式與圖像配合使用可提供有關如何使用混合模式合成圖像的信息,并顯示將混合模式應用于兩個圖像的結(jié)果初嘹。

Normal Blend Mode

因為正臣昂海混合模式是默認混合模式屯烦,所以使用常量kCGBlendModeNormal調(diào)用函數(shù)CGContextSetBlendMode僅在使用其他混合模式常量之后將混合模式重置為默認模式。 圖3-15顯示了使用正澄旅迹混合模式繪制圖3-13和圖3-14的結(jié)果。

3-15 使用正澄毯混合模式繪制的矩形
Multiply Blend Mode

乘法混合模式指定將前景圖像樣本與背景圖像樣本相乘。 所得到的顏色至少與兩種貢獻的樣品顏色中的任一種一樣暗闯冷。 圖3-16顯示了使用乘法混合模式繪制圖3-13和圖3-14的結(jié)果。 要使用此混合模式懈词,請使用常量kCGBlendModeMultiply調(diào)用函數(shù)CGContextSetBlendMode蛇耀。

3-16 使用乘法混合模式繪制的矩形
Screen Blend Mode

屏幕混合模式指定將前景圖像樣本的倒數(shù)乘以背景圖像樣本的倒數(shù)蒂窒。 所得到的顏色至少與兩種貢獻的樣品顏色中的任一種一樣輕洒琢。 圖3-17顯示了使用屏幕混合模式繪制圖3-13和圖3-14的結(jié)果褐桌。 要使用此混合模式,請使用常量kCGBlendModeScreen調(diào)用函數(shù)CGContextSetBlendMode呛踊。

3-17 使用屏幕混合模式繪制的矩形
Overlay Blend Mode

覆蓋混合模式指定根據(jù)背景顏色谭网,將前景圖像樣本與背景圖像樣本相乘或篩選。 背景顏色與前景顏色混合以反映背景的亮度或暗度劫乱。 圖3-18顯示了使用覆蓋混合模式繪制圖3-13和圖3-14的結(jié)果锥涕。 要使用此混合模式层坠,請使用常量kCGBlendModeOverlay調(diào)用函數(shù)CGContextSetBlendMode。

3-18 使用重疊混合模式繪制的矩形
Darken Blend Mode

指定通過選擇較暗的樣本(來自前景圖像或背景)創(chuàng)建合成圖像樣本破花。 背景圖像樣本被更暗的任何前景圖像樣本替換。 否則前鹅,背景圖像樣本保持不變尺栖。 圖3-19顯示了使用暗混合模式繪制圖3-13和圖3-14的結(jié)果延赌。 要使用此混合模式叉橱,請使用常量kCGBlendModeDarken調(diào)用函數(shù)CGContextSetBlendMode窃祝。

3-19 使用暗混合模式繪制的矩形
Lighten Blend Mode

指定通過選擇較亮的樣本(從前景或背景)創(chuàng)建復合圖像樣本粪小。 結(jié)果是背景圖像樣本被更輕的任何前景圖像樣本替換。 否則杠愧,背景圖像樣本保持不變流济。 圖3-20顯示了使用lighten混合模式繪制圖3-13和圖3-14的結(jié)果。 要使用此混合模式雕憔,請使用常量kCGBlendModeLighten調(diào)用函數(shù)CGContextSetBlendMode糖声。

3-20 使用淡化混合模式繪制的矩形
Color Dodge Blend Mode

指定使背景圖像樣本變亮以反映前景圖像樣本姨丈。 指定黑色的前景圖像樣本值不會產(chǎn)生變化蟋恬。 圖3-21顯示了使用顏色閃避混合模式繪制圖3-13和圖3-14的結(jié)果歼争。 要使用此混合模式,請使用常量kCGBlendModeColorDodge調(diào)用函數(shù)CGContextSetBlendMode俩莽。

3-21 使用顏色閃避混合模式繪制的矩形
Color Burn Blend Mode

指定使背景圖像樣本變暗以反映前景圖像樣本扮超。 指定白色的前景圖像樣本值不會產(chǎn)生變化蹋肮。 圖3-22顯示了使用彩色混合模式繪制圖3-13和圖3-14的結(jié)果坯辩。 要使用此混合模式漆魔,請使用常量kCGBlendModeColorBurn調(diào)用函數(shù)CGContextSetBlendMode。

3-22 使用顏色混合模式繪制的矩形
Soft Light Blend Mode

指定根據(jù)前景圖像樣本顏色使顏色變深或變亮矢炼。 如果前景圖像樣本顏色比50%灰色更亮句灌,則背景被減輕阵赠,類似于躲避。 如果前景圖像樣本顏色比50%灰色深爹谭,則背景變暗榛搔,類似于燃燒践惑。 如果前景圖像樣本顏色等于50%灰色,則背景不會改變凉袱。 等于純黑色或純白色的圖像樣本會產(chǎn)生較暗或較亮的區(qū)域专甩,但不會產(chǎn)生純黑色或白色钉稍。 整體效果類似于通過在前景圖像上發(fā)射漫射聚光燈所實現(xiàn)的效果贡未。 使用此向場景添加高光。 圖3-23顯示了使用柔光混合模式繪制圖3-13和圖3-14的結(jié)果嫩挤。 要使用此混合模式俐镐,請使用常量kCGBlendModeSoftLight調(diào)用函數(shù)CGContextSetBlendMode哺哼。

3-23 使用柔光混合模式繪制的矩形
Hard Light Blend Mode

指定乘法或屏幕顏色取董,具體取決于前景圖像樣本顏色茵汰。 如果前景圖像樣本顏色比50%灰色更亮蹂午,則背景被減輕,類似于篩選奥洼。 如果前景圖像樣本顏色比50%灰色深灵奖,則背景變暗估盘,類似于乘法遣妥。 如果前景圖像樣本顏色等于50%灰色,則前景圖像不改變沙咏。 等于純黑色或純白色的圖像樣本導致純黑色或白色肢藐。 整體效果類似于通過在前景圖像上照射嚴酷的聚光燈所實現(xiàn)的效果吱韭。 使用此向場景添加高光理盆。 圖3-24顯示了使用硬光混合模式繪制圖3-13和圖3-14的結(jié)果猿规。 要使用此混合模式,請使用常量kCGBlendModeHardLight調(diào)用函數(shù)CGContextSetBlendMode蘸拔。

3-24 使用硬光混合模式繪制的矩形
Difference Blend Mode

指定從背景圖像樣本顏色中減去前景圖像樣本顏色调窍,或反之邓萨,根據(jù)哪個樣本具有較大的亮度值。 黑色的前景圖像樣本值不變; 白色反轉(zhuǎn)背景顏色值宝剖。 圖3-25顯示了使用差分混合模式繪制圖3-13和圖3-14的結(jié)果诈闺。 要使用此混合模式铃芦,請使用常量kCGBlendModeDifference調(diào)用函數(shù)CGContextSetBlendMode刃滓。

3-25 使用差異混合模式繪制的矩形
Exclusion Blend Mode

指定與kCGBlendModeDifference產(chǎn)生的效果類似的效果咧虎,但對比度較低砰诵。 黑色的前景圖像樣本值不會產(chǎn)生變化; 白色反轉(zhuǎn)背景顏色值。 圖3-26顯示了使用排除混合模式繪制圖3-13和圖3-14的結(jié)果总寒。 要使用此混合模式摄闸,請使用常量kCGBlendModeExclusion調(diào)用函數(shù)CGContextSetBlendMode妹萨。

3-26 使用排除混合模式繪制的矩形
Hue Blend Mode

指定使用背景的亮度和飽和度值與前景圖像的色調(diào)熏兄。 圖3-27顯示了使用色調(diào)混合模式繪制圖3-13和圖3-14的結(jié)果树姨。 要使用此混合模式娃弓,請使用常量kCGBlendModeHue調(diào)用函數(shù)CGContextSetBlendMode岛宦。

3-27 使用色相混合模式繪制的矩形
Saturation Blend Mode

指定使用背景的亮度和色調(diào)值與前景圖像的飽和度。 沒有飽和度的背景區(qū)域(即防嗡,純灰色區(qū)域)不產(chǎn)生變化蚁趁。 圖3-28顯示了使用飽和混合模式繪制圖3-13和圖3-14的結(jié)果他嫡。 要使用此混合模式庐完,請使用常量kCGBlendModeSaturation調(diào)用函數(shù)CGContextSetBlendMode门躯。

3-28 使用飽和度混合模式繪制的矩形
Color Blend Mode

指定使用背景的亮度值與前景圖像的色相和飽和度值讶凉。 此模式保留圖像中的灰度級懂讯。 您可以使用此模式對單色圖像進行著色或?qū)Σ噬珗D像進行著色。 圖3-29顯示了使用顏色混合模式繪制圖3-13的圖3-14的結(jié)果台谊。 要使用此混合模式锅铅,請使用常量kCGBlendModeColor調(diào)用函數(shù)CGContextSetBlendMode减宣。

3-29 使用顏色混合模式繪制的矩形
Luminosity Blend Mode

指定使用背景的色相和飽和度與前景圖像的亮度贼邓。 此模式創(chuàng)建的效果與kCGBlendModeColor創(chuàng)建的效果相反闷尿。 圖3-30顯示了使用光度混合模式繪制圖3-13和圖3-14的結(jié)果填具。 要使用此混合模式,請使用常量kCGBlendModeLuminosity調(diào)用函數(shù)CGContextSetBlendMode誉简。

3-30 使用亮度混合模式繪制的矩形

剪切路徑

當前剪裁區(qū)域是從用作掩碼的路徑創(chuàng)建的闷串,允許您阻止不想繪制的頁面部分烹吵。例如肋拔,如果您有一個非常大的位圖圖像只损,并且只想顯示它的一小部分,您可以設置剪切區(qū)域叮叹,只顯示您要顯示的部分蛉顽。

當你繪畫時先较,Quartz只在剪貼區(qū)域內(nèi)繪畫闲勺。在剪切區(qū)域的閉合子路徑內(nèi)發(fā)生的繪制是可見的;在剪切區(qū)域的閉合子路徑外發(fā)生的繪制不是菜循。

當最初創(chuàng)建圖形上下文時癌幕,剪切區(qū)域包括上下文的所有可繪制區(qū)域(例如,PDF上下文的媒體框)橙喘。通過設置當前路徑然后使用裁剪函數(shù)代替繪圖函數(shù)來更改裁剪區(qū)域厅瞎。剪切函數(shù)使當前路徑的填充區(qū)域與現(xiàn)有剪切區(qū)域相交磁奖。因此某筐,您可以交叉裁剪區(qū)域南誊,縮小圖片的可見區(qū)域抄囚,但不能增加裁剪區(qū)域的面積。

剪切區(qū)域是圖形狀態(tài)的一部分穴亏。要將剪裁區(qū)域恢復到先前的狀態(tài)嗓化,您可以在剪裁之前保存圖形狀態(tài)刺覆,并在完成剪切繪制后恢復圖形狀態(tài)史煎。

清單3-1顯示了一個以圓形形狀設置剪切區(qū)域的代碼片段篇梭。此代碼導致繪圖被剪切恬偷,類似于圖3-3所示喉磁。 (有關另一個示例,請參閱“漸變”一章中的“剪輯上下文”涝焙。)

// 設置圓形剪裁區(qū)域
CGContextBeginPath (context);
CGContextAddArc (context, w/2, h/2, ((w>h) ? h : w)/2, 0, 2*PI, 0);
CGContextClosePath (context);
CGContextClip (context);
剪切圖形上下文的函數(shù)
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赤兴,一起剝皮案震驚了整個濱河市桶良,隨后出現(xiàn)的幾起案子沮翔,更是在濱河造成了極大的恐慌采蚀,老刑警劉巖榆鼠,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妆够,死亡現(xiàn)場離奇詭異神妹,居然都是意外死亡灾螃,警方通過查閱死者的電腦和手機腰鬼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門熄赡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彼硫,“玉大人,你說我怎么就攤上這事词渤∪迸埃” “怎么了高氮?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵剪芍,是天一觀的道長罪裹。 經(jīng)常有香客問我,道長费彼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮关划,結(jié)果婚禮上贮折,老公的妹妹穿的比我還像新娘调榄。我一直安慰自己每庆,他們只是感情好缤灵,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布伦籍。 她就那樣靜靜地躺著,像睡著了一般腮出。 火紅的嫁衣襯著肌膚如雪帖鸦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天胚嘲,我揣著相機與錄音作儿,去河邊找鬼。 笑死慢逾,一個胖子當著我的面吹牛灭红,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播口注,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼变擒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寝志?” 一聲冷哼從身側(cè)響起娇斑,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎材部,沒想到半個月后毫缆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡乐导,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年苦丁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片物臂。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡旺拉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棵磷,到底是詐尸還是另有隱情展蒂,我是刑警寧澤粱檀,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布扮叨,位于F島的核電站藤树,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏算吩。R本人自食惡果不足惜留凭,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赌莺。 院中可真熱鬧冰抢,春花似錦、人聲如沸艘狭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巢音。三九已至遵倦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間官撼,已是汗流浹背梧躺。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掠哥。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓巩踏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親续搀。 傳聞我的和親對象是個殘疾皇子塞琼,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容