H5 Canvas 繪圖


一、什么是Canvas

Canvas 是H5的一部分,允許腳本語言動態渲染圖像。Canvas定義一個區域,可以由html屬性定義該區域的寬高,JavaScript代碼可以訪問該區域,通過一整套完整的繪圖功能(API),在網頁上渲染動態效果圖。

二、Canvas能做什么

  1. 游戲:毫無疑問,游戲在HTML5領域具有舉足輕重的地位。HTML5在基於Web的圖像顯示方面比Flash更加立體、更加精巧。

  2. 圖表制作:圖表制作時常被人們忽略,但無論企業內部還是企業間交流合作都離不開圖表。現在一些開發者使用HTML/CSS完成圖標制作。當然,使用SVG(可縮放矢量圖形)來完成圖表制作也是非常好的方法。

  3. 字體設計:對於字體的自定義渲染將完全可以基於Web,使用HTML5技術進行實現。

  4. 圖形編輯器:圖形編輯器能夠100%基於Web實現。

  5. 其他可嵌入網站的內容:類似圖表、音頻、視頻,還有許多元素能夠更好地與Web融合,並且不需要任何插件。

三、Canvas基本用法

3.1 使用Canvas必須先設置其width、height屬性,指定可繪圖區域大小。不指定的情況默認大小 為300X150 背景透明。

<canvas id="myCanvas" style="width: 300px;height: 200px;border:  1px solid red;"></canvas>

 

 3.2 繪制一個帶粉色的矩形框

繪制圖像的話,我們首先要取到canvas並調用getContext()方法,然后傳入上下文名字(2D/3D),2D有兩種基本繪圖操作|填充(fillStyle)|描邊(strokeStyle)|,這兩個屬性默認值為#000。

        <script >
            
            //獲取canvas元素
            var c=document.getElementById("myCanvas");
            //創建ctx對象
            var ctx=c.getContext("2d");
            //fillStyle屬性可以是CSS顏色,漸變,或圖案。fillStyle 默認設置是#000000(黑色)。
            //fillRect(x,y,width,height) 方法定義了矩形當前的填充方式。
            ctx.fillStyle="#FF0000";
            ctx.fillRect(0,0,150,75);
            
        </script>

 

 3.3繪制路徑

3.3.1 beginPath():新建一條路徑,一旦創建成功,圖形繪制命令被指向到路徑上生成路徑

3.3.2 moveTo(x,y):將畫筆移動到指定坐標,類似起點

3.3.3 lineTo(x,y) :將畫筆移動到結束坐標,類似終點

3.3.4 closePath():閉合路徑

 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <canvas id="myCanvas" style="border:  1px solid red;"></canvas>
    
        <script >
             var myCanvas=document.querySelector("#myCanvas");
             myCanvas.width="500";
             myCanvas.height="300";
             var  cxt=myCanvas.getContext("2d");
             
    
//             moveTo(x,y) 定義線條開始坐標
//             lineTo(x,y) 定義線條結束坐標
            //畫三角形
             cxt.moveTo(50,50);
             cxt.lineTo(250,100);
             cxt.lineTo(50,200);
             cxt.lineTo(50,50);
             //畫直線
             cxt.moveTo(0,0);
             cxt.lineTo(500,300);
            
             cxt.moveTo(0,50);
             cxt.lineTo(400,300);
            
             cxt.strokeStyle="red";
             cxt.lineWidth="5px";
             cxt.lineCap="round";
             cxt.stroke();
        </script>
    
    </body>
</html>

 注:

lineCap=butt(線末端為方形) | round(線末端為圓形) | square(線末端為方形,但增加了一個寬度和線段相同,高度是線段厚度一半的區域)

 

 

 lineJoin=round(拐角處扇形) | bevel(拐角處矩形) |miter(拐角處菱形)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <canvas id="myCanvas" width="500px" height="500px"></canvas>
        <script type="text/javascript">
    function draw(){
    var canvas = document.getElementById('myCanvas');
    if (!canvas.getContext) return;
    var ctx = canvas.getContext("2d");
 
    var lineJoin = ['round', 'bevel', 'miter'];
    ctx.lineWidth = 20;
 
    for (var i = 0; i < lineJoin.length; i++){
        ctx.lineJoin = lineJoin[i];
        ctx.beginPath();
        ctx.moveTo(50, 50 + i * 50);
        ctx.lineTo(100, 100 + i * 50);
        ctx.lineTo(150, 50 + i * 50);
        ctx.lineTo(200, 100 + i * 50);
        ctx.lineTo(250, 50 + i * 50);
        ctx.stroke();
    }
 
}
draw();
        </script>

    </body>
</html>

 

 

 

 

 3.4 畫圓

 
         

var myCanvas=document.querySelector("#myCanvas");
myCanvas.width="1000";
myCanvas.height="300";
var cxt=myCanvas.getContext("2d");

            
//aarc(x,y,radius,startAngle,endAngle,conterclockwise) // (x,y)圓心坐標、radius半徑、(startAngle,endAngle)起始角度和終止角度、conterclockwise順時針(false)/逆時針(true)

// cxt.closePath();決定路徑是否閉合
cxt.lineWidth="5";
cxt.strokeStyle="red";
for(var i=0;i<10;i++){
cxt.beginPath();
cxt.arc(50+i*100,60,40,0,2*Math.PI*(i+1)/10);
cxt.closePath();
cxt.stroke();
}

for(var i=0;i<10;i++){
cxt.beginPath();
cxt.arc(50+i*100,180,40,0,2*Math.PI*(i+1)/10);

cxt.stroke();
}

 

 

 

 3.5 繪制文本

使用canvas繪制文本主要有以下幾個屬性和方法

font——定義字體,大小

textAlign——文本對齊方式

textBaseline——文本的基線(|top|hanging|middle|alphabetic|ideographic|bottom

fillText(text(要繪制的文本),x,y)——在canvas上繪制實心的文本

strokeText(text,x,y)——在canvas上繪制空心的文本

 
         

var myCanvas=document.querySelector("#myCanvas");
myCanvas.width="1000";
myCanvas.height="300";
var cxt=myCanvas.getContext("2d");

cxt.font="30px Arial";

cxt.fillText("Hello World",20,50);

cxt.font="60px Arial";

cxt.strokeText("Hello World",20,150);

 

 3.6 繪制圖像

canvas繪制圖像主要用drawImage(image,x,y)

 var myCanvas=document.querySelector("#myCanvas");
myCanvas.width="1000";
 myCanvas.height="300";
var  cxt=myCanvas.getContext("2d");
var imgObj=new Image();
imgObj.src="img/pic4.jpg"//原圖像大小1000×1419
imgObj.onload=function(){
cxt.drawImage(this,0,0,200,300);//this即imgObj,200,300指改變圖片的大小
cxt.drawImage(this,220,0,200,300);
}

 3.7 漸變

線性漸變:createLinearGradient(x,y,x1,y1) - 創建線條漸變

var myCanvas=document.querySelector("#myCanvas");
myCanvas.width="1000";
myCanvas.height="300";
var cxt=myCanvas.getContext("2d");

 
//矩形漸變 var grd=cxt.createLinearGradient(0,0,175,50); grd.addColorStop(0,"#FF0000"); grd.addColorStop(1,"#00FF00"); cxt.fillStyle=grd; cxt.fillRect(0,0,175,50); //圓形漸變 var grd1=cxt.createLinearGradient(0,0,175,50); grd1.addColorStop(0,"#FF0000"); grd1.addColorStop(1,"#00FF00"); cxt.beginPath(); cxt.arc(105,160,50,0,Math.PI*2); cxt.fillStyle=grd1; cxt.fill(); cxt.closePath();

效果如下:

 

 

 

徑向漸變:createRadialGradient(x,y,r,x1,y1,r1) - 創建一個徑向/圓漸變

 
         

var myCanvas=document.querySelector("#myCanvas");
myCanvas.width="1000";
myCanvas.height="300";
var cxt=myCanvas.getContext("2d");

var grd=cxt.createRadialGradient(75,50,5,90,60,100);
grd.addColorStop(0,"#FF0000");
grd.addColorStop(1,"#00FF00");

//矩形 
cxt.fillStyle=grd;
cxt.fillRect(10,10,150,80);

//圓形

 var rg1=cxt.createRadialGradient(310,61,1,310,111,100);
        rg1.addColorStop(0,"#fff");
        rg1.addColorStop(1,"black");

        cxt.beginPath();
        cxt.arc(310,111,100,0,Math.PI*2);
        cxt.fillStyle=rg1;
        cxt.fill();
        cxt.closePath();

效果如下:

 

 addColorStop()方法指定顏色停止

 3.8 狀態的保存和恢復

保存或者恢復 canvas 里的狀態 (填充,描邊,漸變,坐標位移,裁切)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <canvas id="myCanvas" width="500px" height="500px"></canvas>
        <script type="text/javascript">


var ctx;
function draw(){
    var canvas = document.getElementById('myCanvas');
    if (!canvas.getContext) return;
    var ctx = canvas.getContext("2d");
 
    ctx.fillRect(0, 0, 150, 150);   // 使用默認設置繪制一個矩形
    ctx.save();                  // 保存默認狀態
 
    ctx.fillStyle = 'red'       // 在原有配置基礎上對顏色做改變
    ctx.fillRect(15, 15, 120, 120); // 使用新的設置繪制一個矩形
 
    ctx.save();                  // 保存當前狀態
    ctx.fillStyle = '#FFF'       // 再次改變顏色配置
    ctx.fillRect(30, 30, 90, 90);   // 使用新的配置繪制一個矩形
 
    ctx.restore();               // 重新加載之前的顏色狀態
    ctx.fillRect(45, 45, 60, 60);   // 使用上一次的配置繪制一個矩形
 
    ctx.restore();               // 加載默認顏色配置
    ctx.fillRect(60, 60, 30, 30);   // 使用加載的配置繪制一個矩形
}
draw();
        </script>

    </body>
</html>

3.9 變換

3.9.1 translate(x,y) 移動到指定位置

3.9.2  rotate(angle)順時針旋轉,以坐標原點為中心

3.9.3 scale(x,y)  增減圖形在 canvas 中的像素數目,對形狀,位圖進行縮小或者放大。參數x,y默認1,比1小的縮減,比1大的增倍

3.10 合成

globalCompositeOperation = type

var ctx;
function draw(){
    var canvas = document.getElementById('myCanvas'); 

if (!canvas.getContext) return;
var ctx = canvas.getContext("2d");
ctx.fillStyle
= "blue";
ctx.fillRect(
0, 0, 200, 200);
ctx.globalCompositeOperation
= "source-over"; //全局合成操作
ctx.fillStyle = "red";
ctx.fillRect(
100, 100, 200, 200);
}
draw();

注:藍舊紅新

3.10.1 默認source-over,新圖像覆蓋

 

 3.10.2 source-in 僅僅會出現新圖像與原來圖像重疊的部分,其他區域都變成透明的。(包括其他的老圖像區域也會透明)

 

 

 3.10.3 source-out 僅僅顯示新圖像與老圖像沒有重疊的部分,其余部分全部透明。(老圖像也不顯示)

 

 3.10.4 source-top 新圖像僅僅顯示與老圖像重疊區域。老圖像仍然可以顯示。

 

 3.10.5 destination-over 新圖像會在老圖像的下面。

 

 

 3.10.6 destination-in 僅僅新老圖像重疊部分的老圖像被顯示,其他區域全部透明。

 

 

 3.10.7 destination-out 僅僅老圖像與新圖像沒有重疊的部分。 注意顯示的是老圖像的部分區域。

 

 

 3.10.8destination-atop 老圖像僅僅僅僅顯示重疊部分,新圖像會顯示在老圖像的下面。

 

 

 3.10.9 lighter 新老圖像都顯示,但是重疊區域的顏色做處理

3.10.10   darken 新老圖像都顯示,重疊部分顯示最黑像素(每個顏色位進行比較,得到最小的)

3.10.11  lighten 保證重疊部分最量的像素。(每個顏色位進行比較,得到最大的)

3.10.12 xor 重疊部分為透明

3.10.13 copy 僅保留新圖像

關於canvas的基本用法就到這,后面會整一些小案例

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM