1. 程式人生 > >canvas學習一之canvas的基本使用

canvas學習一之canvas的基本使用

一、canvas
1.canvas是html5中的一個標籤,通過canvas的getContext得到上下文可以繪圖等操作。canvas通過js進行API操作,可以得到想要的圖形或動畫。
2.html5中canvas有兩套尺寸,第一個是元素本身的大小,在標籤的屬性裡指定;還有一個是繪圖表面的大小,標籤屬性和css都可以修改。預設情況下,canvas的元素大小和繪圖表面都是300*150;當兩者不一致時,瀏覽器會對畫圖表面進行縮放,使其符合元素的大小。舉個例子如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta
charset="UTF-8">
<title>canvas基本使用</title> <style type="text/css"> body { background: #dddddd; } #canvas,#canvas1 { margin: 20px; padding: 20px; background: #ffffff; border: thin inset #aaaaaa
; width: 600px; height: 300px; }
</style> </head> <body> <canvas id='canvas'> 不支援canvas </canvas> <canvas id="canvas1" width="600" height="300"> 不支援canvas </canvas> </body> <script type="text/javascript"
>
var canvas = document.getElementById('canvas'), context = canvas.getContext('2d'); context.font = '38pt Arial'; context.fillStyle = 'cornflowerblue'; context.strokeStyle = 'blue'; context.fillText("Hello Canvas", canvas.width/2 - 150, canvas.height/2 + 15); context.strokeText("Hello Canvas", canvas.width/2 - 150, canvas.height/2 + 15); var canvas1 = document.getElementById('canvas1'), context1 = canvas1.getContext('2d'); context1.font = '38pt Arial'; context1.fillStyle = 'cornflowerblue'; context1.strokeStyle = 'blue'; context1.fillText("Hello Canvas", canvas1.width/2 - 150, canvas1.height/2 + 15); context1.strokeText("Hello Canvas", canvas1.width/2 - 150, canvas1.height/2 + 15); </script> </html>

當沒有在標籤中指定寬高時,元素本身預設300*150,繪圖表面也是300*150,當在css中修改寬高時,只修改元素本身大小,為600*300,繪圖表面沒有修改,還是300*150,兩者不相等,於是瀏覽器會對畫布進行縮放,使之符合大小。這裡是橫向豎向都放大2倍。

所以,當使用canvas時,最好在標籤寫好寬高,如果不可以,還可以使用js指令碼給canvas加上寬高。

二、2個屬性3個方法
2個屬性:
width 畫圖表面的寬;
height 畫圖表面的高
3個方法:
getContext():獲得繪圖物件,一般getContext(“2d”)獲得2d繪圖物件;
toDateURL(type,quality):獲得一個數據地址,這個是將canvas畫布中的內容轉化為影象,再將影象轉為base64編碼,最後得到的是一串字串。type有image/png,image/jpeg兩種,雖然base64有image/gif,但經我測試用火狐測試,不可以轉成gif(?)。quality是圖片的質量,從0-1.0的double數值;
toBlob(callback,type,args) Blob二進位制大物件,將圖片轉成Blob.callback一個以獲得的blob為引數的回撥函式,type是圖片型別,args圖片質量;

將上面程式碼,修改一下,得到兩個方法的照片:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>兩種方法,將canvas轉成影象</title>
    <style type="text/css">
        body {
            background: #dddddd;
         }
         #canvas{
            margin: 20px;
            padding: 20px;
            background: #ffffff;
            border: thin inset #aaaaaa;
            width: 600px;
            height: 300px;
         }
    </style>
</head>
<body>
    <canvas id='canvas' width="600" height="300">
        不支援canvas
    </canvas>
    <img id="img">
</body>
<script type="text/javascript">

    var canvas = document.getElementById('canvas'),
    context = canvas.getContext('2d');
    context.font = '38pt Arial';
    context.fillStyle = 'cornflowerblue';
    context.strokeStyle = 'blue';
    context.fillText("Hello Canvas", canvas.width/2 - 150,
                                 canvas.height/2 + 15);
    context.strokeText("Hello Canvas", canvas.width/2 - 150,
                                   canvas.height/2 + 15);
    var href = canvas.toDataURL("image/png", 0.1);
    var image = document.getElementById("img");//靜態獲取img節點
    image.src=href;
    canvas.toBlob(function(blob){
        var newImg = document.createElement("img"),//動態生成img節點
        url = URL.createObjectURL(blob);
        newImg.onload = function() {
            URL.revokeObjectURL(url);//載入完成,釋放url
        };
        newImg.src = url;
        document.body.appendChild(newImg);
    },"image/png",0.1)
</script>
</html>

兩者影象地址不一致:
toDataURL得到data:image/png;base64開頭的字串
toBlob得到blob:null/d871fc67-7a9a-41e1-82b2-9954eca7d198

toDataURL得到影象可以另存為儲存到硬碟,但是blob不可以。