Canvas的絢爛起點

靈感愛學習發表於2019-05-01

很多人知道canvas,但不一定都熟悉或者經常使用,作為一種專項工具,如果業務不是跟影像或者圖表強相關,的確不常用,但對它的學習和了解還是必要的,這篇文章我們就一起來入個門。

Canvas是什麼

可以理解為,它提供了一塊畫布,在它所掌控的區域,可以運用各種方法繪製圖形、文字,或者製作動畫、處理影像,等等。

通常我們能夠看到一些炫酷的動畫,很多都是canvas做出來的,但是需要各種元素和技巧綜合使用,不是一蹴而就的,我們先從基礎看起。

搭好舞臺

    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");

    <canvas id="canvas" width="150" height="150"></canvas>
複製程式碼

三行程式碼,完成舞臺搭建。

繪製的幾要素

位置:從哪裡開始

路徑:圖形的軌跡

輪廓:繪製空心圖形

填充:繪製實心區域

用程式碼來表達就是:

畫筆位置——moveTo(x, y)

將畫筆移動到指定的座標x、y。

直線——lineTo(x, y)

繪製一條從當前位置到指定位置的直線。

圓弧——arc(x, y, radius, startAngle, endAngle, anticlockwise)

畫一個以(x,y)為圓心、以radius為半徑的圓弧(圓),從startAngle開始到endAngle結束,按照anticlockwise給定的方向(預設為順時針)來生成。

矩形——rect(x, y, width, height)

繪製一個左上角座標為(x,y),寬高為width以及height的矩形。

幾個基本的圖形就是這樣了,還有一種比較複雜的是貝塞爾曲線。

二次貝塞爾——quadraticCurveTo(cp1x, cp1y, x, y)

三次貝塞爾——bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

什麼是較複雜的圖形呢?比如:氣泡、心形,或者其他不是很常規的形狀,如使用上面的方法就較難實現,貝塞爾曲線更能勝任。

那其實除了這些,canvas還有兩個動作要做,就是開始結束繪製的指令,分別是:

beginPath()closePath()

放在路徑繪製的開端和末尾,就像這樣:

    ctx.beginPath();
    ctx.moveTo(125,125);
    ctx.lineTo(125,45);
    ctx.lineTo(45,125);
    ctx.closePath();
複製程式碼

(如果路徑本身就是閉合的,可以省去closePath,但一般建議保留)

完成這些之後,就可以進行下一步,繪製輪廓,或者填充區域,當然,可以兩者都做:

    ctx.stroke();  //輪廓
    ctx.fill();   //填充
複製程式碼

除了這兩個操作,還有其他的操作,比如設定色值、線寬、是否旋轉等,後面做豐富示例時我們再一一介紹。

完整示例如下:

    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");
    ctx.beginPath();
    ctx.moveTo(125,125);
    ctx.lineTo(125,45);
    ctx.lineTo(45,125);
    ctx.closePath();
    ctx.stroke();//輪廓

    ctx.beginPath();
    ctx.arc(200, 200, 40, 0, 36, false);
    ctx.closePath();
    ctx.fillStyle="rgb(2,100,30)";//填充顏色
    ctx.fill();//填充
複製程式碼

Canvas的絢爛起點

Canvas的絢爛起點

這只是一個很簡單的效果,我們也看到了路徑之後其他設定項的出現,就是填充顏色,這只是其中之一,但這裡暫時不詳述,我們先看看,除了圖形,canvas還能做什麼?

文字和圖片

文字很好實現,直接上程式碼:

    ctx.font = "48px serif"; //字號、字型型別
    ctx.fillText("Hello world", 10, 300); // 文字內容和位置
複製程式碼

但其實文字也是有兩種效果的,填充和輪廓,上面這種是填充:

Canvas的絢爛起點

如果把第二行程式碼換成:

ctx.strokeText("Hello world", 10, 50);
複製程式碼

就是輪廓了

Canvas的絢爛起點

除此之外,還有一些對齊方式和文字方向的設定,先略去。

來看看圖片

圖片分為兩塊,處理圖片和繪製圖片。

獲取同頁面內的圖片不再贅述,跟通常的dom操作一樣,看看建立圖片的方法:

    var img = new Image();   // 建立一個<img>元素
    img.src = 'myImage.png'; // 設定圖片源地址
複製程式碼

獲取或者建立了影像,怎麼把它繪製到canvas裡去呢?

drawImage(image, x, y)

其中 image 是 image 或者 canvas 物件,x 和 y 是其在目標 canvas 裡的起始座標。

比如我們可以把上面的程式碼寫成這樣:

    var ctx = document.getElementById('canvas').getContext('2d');
        var img = new Image();
        img.onload = function(){
        ctx.drawImage(img,0,0);
        }
        img.src = '/img/canvas_intro/canvas_01.png';
複製程式碼

上面這段程式碼,我把當前頁面的三角形拿了過來,就是跟前面那個效果一樣的了

Canvas的絢爛起點

這裡只是把影像放入我們的工作區,如果想在這個區域畫別的圖形亦可,程式碼接著往下寫就好了,有時候這可以為我們節省成本,比如,稍複雜一點的影像作為背景,簡單的圖形作為前景畫出。

那其實這個方法也不止這麼簡單,它有兩個變種

縮放

drawImage(image, x, y, width, height)

即指定影像大小,也就是可以根據需要進行縮放。

裁切

drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)

一長串引數看著有點頭皮發麻,但就因為這樣,才能讓我們去操作細節,它是用來裁切影像的。

前面四個用來處理圖片源的剪下起始位置和大小,就跟我們平時截圖一個道理,後面的引數,是將裁切後的影像,放置在畫布的什麼位置,以及那個區域的大小。如下所示:

Canvas的絢爛起點

小結

這篇文從零開始介紹了canvas的工具箱裡有哪些工具,雖然尚不完整,作為開端,已經夠多,先到這,更多功能我們下篇再聊~

相關文章