在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ Ch19 全局陰影與圖像合成
Ch22 最后的API
Ch14 旋轉(zhuǎn)變換
Ch19 全局陰影與圖像合成
Ch12 三次貝塞爾曲線
Ch4 多線條組成圖形
Ch7 填充顏色
Ch6 線條的屬性
Ch20 裁剪和繪制圖像
CANVAS——Draw on the Web
Ch18 文本對(duì)齊與度量
Ch8 填充樣式
Ch15 縮放變換
Ch9 繪制標(biāo)準(zhǔn)圓弧
Ch2 開始前的準(zhǔn)備
Ch16 矩陣變換
Ch3 從線段開始
Ch10 使用切點(diǎn)繪制圓弧
Ch21 非零環(huán)繞原則
Ch11 二次貝塞爾曲線
Ch5 繪制矩形
Ch17 文本顯示與渲染
Ch1 HTML5簡(jiǎn)介
Ch13 平移變換

Ch19 全局陰影與圖像合成

陰影效果

創(chuàng)建陰影效果需要操作以下4個(gè)屬性:

  • context.shadowColor:陰影顏色。
  • context.shadowOffsetX:陰影x軸位移。正值向右,負(fù)值向左。
  • context.shadowOffsetY:陰影y軸位移。正值向下,負(fù)值向上。
  • context.shadowBlur:陰影模糊濾鏡。數(shù)據(jù)越大,擴(kuò)散程度越大。

這四個(gè)屬性只要設(shè)置了第一個(gè)和剩下三個(gè)中的任意一個(gè)就有陰影效果。不過通常情況下,四個(gè)屬性都要設(shè)置。

例如,創(chuàng)建一個(gè)向右下方位移各5px的紅色陰影,模糊2px,可以這樣寫。

context.shadowColor = "red";
context.shadowOffsetX = 5;
context.shadowOffsetY = 5;
context.shadowBlur= 2;

需要注意的是,這里的陰影同其他屬性設(shè)置一樣,都是基于狀態(tài)的設(shè)置。因此,如果只想為某一個(gè)對(duì)象應(yīng)用陰影而不是全局陰影,需要在下次繪制前重置陰影的這四個(gè)屬性。

下面的例子摘抄自《HTML5 Canvas開發(fā)詳解》第二版,案例名為 textArranger,是一個(gè)交互的網(wǎng)頁。結(jié)合了上兩節(jié)所說的 文本API 和本節(jié)的陰影屬性。大家可以自己打開鏈接嘗試一下,看看每個(gè)屬性的效果是什么。本例代碼過長(zhǎng),在此不貼。

演示 19-1

運(yùn)行結(jié)果:

textArranger

全局透明globalAlpha

這個(gè)也是很簡(jiǎn)單的一個(gè)屬性,默認(rèn)值為1.0,代表完全不透明,取值范圍是0.0(完全透明)~1.0。這個(gè)屬性與陰影設(shè)置是一樣的,如果不想針對(duì)全局設(shè)置不透明度,就得在下次繪制前重置globalAlpha。

總結(jié)一下:基于狀態(tài)的屬性有哪些?

——globalAlpha

——globalCompositeOpeartion

——strokeStyle

——textAlign,textBaseline

——lineCap,lineJoin,lineWidth,miterLimit

——fillStyle

——font

——shadowBlur,shadowColor,shadowOffsetX,shadowOffsetY

我們通過一個(gè)代碼,來體驗(yàn)一下globalAlpha的神奇之處~

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>全局透明</title>
    <style>
        body { background: url("./images/bg3.jpg") repeat; }
        #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
    </style>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas">
        你的瀏覽器居然不支持Canvas?!趕快換一個(gè)吧??!
    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");
        context.fillStyle = "#FFF";
        context.fillRect(0,0,800,600);

        context.globalAlpha = 0.5;

        for(var i=0; i<=50; i++){
            var R = Math.floor(Math.random() * 255);
            var G = Math.floor(Math.random() * 255);
            var B = Math.floor(Math.random() * 255);

            context.fillStyle = "rgb(" + R + "," + G + "," + B + ")";

            context.beginPath();
            context.arc(Math.random() * canvas.width, Math.random() * canvas.height, Math.random() * 100, 0, Math.PI * 2);
            context.fill();
        }
    };
</script>
</body>
</html>

演示 19-2

運(yùn)行結(jié)果:

globalAlpha

是不是非常的酷?終于有點(diǎn)藝術(shù)家的范兒了吧。

圖像合成globalCompositeOperation

兩個(gè)圖像重合的時(shí)候,就涉及到了對(duì)這兩個(gè)圖像的合成處理。globalCompositeOperation屬性設(shè)置或返回如何將一個(gè)源(新的)圖像繪制到目標(biāo)(已有)的圖像上。

源圖像 = 您打算放置到畫布上的繪圖。

目標(biāo)圖像 = 您已經(jīng)放置在畫布上的繪圖。

描述
source-over 默認(rèn)。在目標(biāo)圖像上顯示源圖像。
source-atop 在目標(biāo)圖像頂部顯示源圖像。源圖像位于目標(biāo)圖像之外的部分是不可見的。
source-in 在目標(biāo)圖像中顯示源圖像。只有目標(biāo)圖像內(nèi)的源圖像部分會(huì)顯示,目標(biāo)圖像是透明的。
source-out 在目標(biāo)圖像之外顯示源圖像。只會(huì)顯示目標(biāo)圖像之外源圖像部分,目標(biāo)圖像是透明的。
destination-over 在源圖像上方顯示目標(biāo)圖像。
destination-atop 在源圖像頂部顯示目標(biāo)圖像。源圖像之外的目標(biāo)圖像部分不會(huì)被顯示。
destination-in 在源圖像中顯示目標(biāo)圖像。只有源圖像內(nèi)的目標(biāo)圖像部分會(huì)被顯示,源圖像是透明的。
destination-out 在源圖像外顯示目標(biāo)圖像。只有源圖像外的目標(biāo)圖像部分會(huì)被顯示,源圖像是透明的。
lighter 顯示源圖像 + 目標(biāo)圖像。
copy 顯示源圖像。忽略目標(biāo)圖像。
xor 使用異或操作對(duì)源圖像與目標(biāo)圖像進(jìn)行組合。

下面我用一段代碼來說明一下這些值的意義。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>圖像合成</title>
    <style>
        #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
    </style>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas">
        你的瀏覽器居然不支持Canvas?!趕快換一個(gè)吧?。?    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");

        context.globalCompositeOperation = "source-out";
        context.globalAlpha = 0.5;

        for(var i=0; i<=50; i++){
            var R = Math.floor(Math.random() * 255);
            var G = Math.floor(Math.random() * 255);
            var B = Math.floor(Math.random() * 255);

            context.fillStyle = "rgb(" + R + "," + G + "," + B + ")";

            context.beginPath();
            context.arc(Math.random() * canvas.width, Math.random() * canvas.height, Math.random() * 100, 0, Math.PI * 2);
            context.fill();
        }

    };
</script>
</body>
</html>

演示 19-3

運(yùn)行結(jié)果:

globalCompositeOperation

我這個(gè)代碼相對(duì)比較簡(jiǎn)單,這里推薦一下laijieyao的專欄——【HTML5】Canvas之globalCompositeOperation屬性詳解,這篇博客里面介紹了該屬性的11值的不同效果,大家可以看一下有一個(gè)直觀的感受。

這里的代碼和上面的一樣,但是用到了圖像合成,所以把背景和空白矩形去掉了,不然的話所有的圖像都是合成圖像,因?yàn)樗麄兌际墙⒃谀莻€(gè)空白矩形之上的。雖然只加了context.globalCompositeOperation = "source-out";一句而已,其他的圓都不見了,有時(shí)候只會(huì)顯示1~2個(gè)圓。因?yàn)閟ource-out就是圖像合成處理時(shí),保留沒有被疊加的圖像。因此可以推出,在隨機(jī)生成的50個(gè)圓中,有49個(gè)都重疊了。

還有其他的屬性,童鞋們私下也可以自己嘗試一下,都能帶來不一樣的神奇效果。


這一小節(jié)介紹了陰影、透明與圖像合成,大家消化一下,建議其他屬性值都自己嘗試一下加深理解。我們繼續(xù)向著終點(diǎn)前進(jìn)!~