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

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

Ch20 裁剪和繪制圖像

裁剪區(qū)域clip()

使用Canvas繪制圖像的時候,我們經常會想要只保留圖像的一部分,這是我們可以使用canvas API再帶的圖像裁剪功能來實現這一想法。

Canvas API的圖像裁剪功能是指,在畫布內使用路徑,只繪制該路徑內所包含區(qū)域的圖像,不會只路徑外的圖像。這有點像Flash中的圖層遮罩。

使用圖形上下文的不帶參數的clip()方法來實現Canvas的圖像裁剪功能。該方法使用路徑來對Canvas話不設置一個裁剪區(qū)域。因此,必須先創(chuàng)建好路徑。創(chuàng)建完整后,調用clip()方法來設置裁剪區(qū)域。

需要注意的是裁剪是對畫布進行的,裁切后的畫布不能恢復到原來的大小,也就是說畫布是越切越小的,要想保證最后仍然能在canvas最初定義的大小下繪圖需要注意save()restore()。畫布是先裁切完了再進行繪圖。并不一定非要是圖片,路徑也可以放進去~

先來看看一個簡單的Demo。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>裁剪區(qū)域</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?!趕快換一個吧!!
    </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.fillStyle = "black";
        context.fillRect(10,10,200,200);
        context.save();
        context.beginPath();

        //裁剪畫布從(0,0)點至(50,50)的正方形
        context.rect(0,0,50,50);
        context.clip();

        //紅色圓
        context.beginPath();
        context.strokeStyle = "red";
        context.lineWidth = 5;
        context.arc(100,100,100,0,Math.PI * 2,false);
        //整圓
        context.stroke();
        context.closePath();

        context.restore();

        //再次裁切整個畫布
        context.beginPath();
        context.rect(0,0,500,500);
        context.clip();

        //繪制一個沒有裁切的藍線
        context.beginPath();
        context.strokeStyle = "blue";
        context.lineWidth = 5;
        context.arc(100,100,50,0,Math.PI * 2,false);
        //整圓
        context.stroke();
        context.closePath();
    };
</script>
</body>
</html>

演示 20-1

運行結果:

裁剪區(qū)域

自己分析吧,能夠理解這段程序,就完全掌握了clip()方法的使用了。

繪制圖像drawImage()

drawImage()是一個很關鍵的方法,它可以引入圖像、畫布、視頻,并對其進行縮放或裁剪。

一共有三種表現形式:

  1. 三參數:context.drawImage(img,x,y)
  2. 五參數:context.drawImage(img,x,y,width,height)
  3. 九參數:context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height)

三參數的是標準形式,可用于加載圖像、畫布或視頻;五參數的除了可以加載圖像還可以對圖像進行指定寬高的縮放;九參數的除了縮放,還可以裁剪。各參數意義見下表。

參數 描述
img 規(guī)定要使用的圖像、畫布或視頻。
sx 可選。開始剪切的 x 坐標位置。
sy 可選。開始剪切的 y 坐標位置。
swidth 可選。被剪切圖像的寬度。
sheight 可選。被剪切圖像的高度。
x 在畫布上放置圖像的 x 坐標位置。
y 在畫布上放置圖像的 y 坐標位置。
width 可選。要使用的圖像的寬度。(伸展或縮小圖像)
height 可選。要使用的圖像的高度。(伸展或縮小圖像)

下面,我們加載一個圖片試試。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>drawImage()</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?!趕快換一個吧!!
    </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);

        var img = new Image();
        img.src = "./images/20-1.jpg";
        img.onload = function(){
            context.drawImage(img,200,50);
        }
    };
</script>
</body>
</html>

演示 20-2

運行結果:

drawImage()

創(chuàng)建相框

這里,我們結合clip()drawImage()以及之前學的三次貝塞爾曲線bezierCurveTo(),來為上面一個案例,加上一個心形的相框~

<!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?!趕快換一個吧!!
    </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.beginPath();
        context.moveTo(400,260);
        context.bezierCurveTo(450,220,450,300,400,315);
        context.bezierCurveTo(350,300,350,220,400,260);
        context.clip();
        context.closePath();

        var img = new Image();
        img.src = "./images/20-1.jpg";
        img.onload = function(){
            context.drawImage(img,348,240,100,100);
        }
    };
</script>
</body>
</html>

演示 20-3

運行結果截圖:

繪制心形相框

是不是美美的?好啦,至此最關鍵的遮罩和圖像裁剪以及說完了,其實在java.awt中,drawImage()也是一個至關重要的方法。有人說制作Java游戲界面,只要會用drawImage()就可以一招打遍天下~在Canvas里也是一樣的。美工提供的素材基本都是圖片,這個時候drawImage()對圖片的處理就很重要了。即使基本功,也是對圖片最重要的處理方法。

這一節(jié)就跟大家吹這么多了~讓我們繼續(xù)前進!