
混合(Compositing)
Canvas中的混合技术有着非常多的数景及种类,但用在互联网上的不错的例子并不多。大多数混合技术都受限于自身的表现手法,但这正是我们要克服的问题。图0展示了globalCompositeOperation属性的有效关键词、它们的Porter-Duff混合(用斜体AB表示)以及绘制结果。
首先我们绘出一个蓝色矩形作为背景,然后设定好混合方法,最后加上一个红色的圆。globalCompositeOperation使用了默认值source-over,代码如下:
context.beginPath(.);
context千illStyle='cornflowerblue';
context.千;[^〈;1:(!50,50);
context.globalCompositeOperation=*source-over';context.arc(50,50〉3*Math.PI^0);contextfillStyle=’crimson';context.fill();生成的图像如图0所示。
圆为source(A),而矩形为destination(B)。让我们用Porter-Duff术语来解释一下不同的方法,这样我们可以更直观地深人了解。
我们用source-over将A绘于B上t用source-in仅绘出A位于B中的部分丨用source-out仅绘出A在B之外的_分用source-atop绘出B以及A与B重叠的部分。第二行为上述的反例,我们在此略去详细解释。方法lighter为重叠区域添加颜色,并让其变浅。copy将B排除并只绘出A,而xor将A及B的重叠部分去掉。问号表明自定义合成方式同样有效,与getContext()方法类似。
不幸的是,目前尚没有浏览器能完全支持混合功能,因此我们很难在浏览器上演示所有方法。我们会挑选出两个方法,并了解一些有关destination-in及lighter操作的案例。
若使用destination-in将图像与文本合成,我们可以得到一个剪切效果,如图1所示。我们用drawImageO绘制出图像,设定合成方法,然后插人一段最大宽度为0像素的文本。文本的字体大小为像素,顶部居中,边框为60像素,交点和线端contextdrawlmage(image,00);context.globalCompositeOperation='destination-in';contextstrokeText(HTML5,0);浅灰色文本仍旧使用默认混合方法source-over绘制,因此不受其他效果影响。因为之前提到过的浏览器方面的不足,目前无法同时将数段文本同时定义为剪切。
在第二个案例中,我们用lighter方法,对之前提到的图像颜色处理方法做了进一步扩展。图2使用lighter将约塞米蒂照片做成16个标准色的矩形,这比使用颜色滤镜monoColor()的CPU占用率更低,
宁波网站建设认为详见节。
context.drawlmage(img,1);context.globalCompositeOperation=’lighter1;context.rillStyle='blue';context.fillRect(1);我们将在1节的图7的镜面效果中再次提到混合操作destination-out。下面让我们来看下Caiwai中的自定义图案。
本文由乐华网络编辑,转载请注明出处
宁波网站建设www.leseo.net