JavaScript 控制(改變)canvas(畫布)的大小

前段時間在論壇看到有人問如何自由改變畫布大小,閒來無事,就花了點時間解決,在CSDN 博客中沒有相關博文,於是順手記錄下來

html5 裏面有一個新標籤canvas,也就是畫布,畫布常常需要重繪,改變大小等
這裏處理的就是改變大小的問題,
補充一下 ,直接設置樣式改變的只是canvas的大小,但是像素點並沒有因此而改變,所以style 會拉昇canvas的長寬,
只有直接設置attribute的屬性 ,像素點的數量纔會增加,canvas變化的同時,不會拉昇圖形

總結一下改變大小的方式,
1.直接設置style,

document.getElemntById("canvas").style.width=""
document.getElemntById("canvas").style.height=""

這種方法看似可行,實際上並不可以,改變了大小,但是圖像也被拉伸變形.

2.搞清楚了canvas,width和height實際上不是style的屬性,而是attribute屬性
我們可以這樣設置

document.getElemntById("canvas").setAttribute("width","")
document.getElemntById("canvas").setAttribute("height","")

確實這個方法不會拉伸畫布的大小,但是又有新的問題出現了,就是畫布改變大小會被重繪,原來的圖形找不到了,怎麼辦?那就是第三種方法了

3.完美的解決方案,是基於2的基礎之上,先把畫布存儲起來,再改變大小(畫布被重繪),再將存儲的信息,重新繪製到畫布上.

//這裏就上完整的代碼片段了
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<style type="text/css">
canvas{
    background: lawngreen;//畫布背景色,畫布放大縮小,好看出效果
}
</style>
<body>
<canvas id="canvas" width="300" height="300"></canvas>
 <button id="add">add</button><button id="sub">sub</button>
</body>
<script type="text/javascript">
    var content=document.getElementById("canvas").getContext("2d")
    content.fillRect(50,50,100,100);
    content.fillStyle="black"
    //爲了對比看出效果,先繪製一個黑色的矩形

    //綁定加大畫布的操作放在按鈕add上
    document.getElementById("add").οnclick=function(){
        //獲取畫布的寬和高
        var width=canvas.getAttribute("width")
        var height=canvas.getAttribute("height");

        //獲取畫布的圖像信息,一個副本
        var data=content.getImageData(0,0,width,height)

        //重新設置畫布的大小
        width=parseInt(width)+10
        height=parseInt(height)+10
        canvas.setAttribute("width",width)
        canvas.setAttribute("height",height)
        //將獲得的圖像副本,重新繪製到畫布,完成畫布的大小改變
        content.putImageData(data,0,0)
    }
        //方法和上面相同,就是減小而已.
        document.getElementById("sub").οnclick=function(){
            var width=canvas.getAttribute("width")
            var height=canvas.getAttribute("height");

            var data=content.getImageData(0,0,width,height)


            width=parseInt(width)-10
            height=parseInt(height)-10
            canvas.setAttribute("width",width)
            canvas.setAttribute("height",height)

            content.putImageData(data,0,0)
    }
</script>
</html>

總結,雖然畫布的改變大小確實很簡單,但是難免有人陷入誤區(例如我),查找資料,處理一個多小時才解決這個問題.在博客頻道也沒有搜索到相關博文,希望能給後來者提供些微幫助.

在下才疏學淺,如有錯誤或不足之處,還望指教一二.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章