1. 程式人生 > >canvas實現圖片旋轉縮放

canvas實現圖片旋轉縮放

canvas實現圖片旋轉,用到的基本函式:
rotate()實現旋轉;
scale(X,Y)實現縮放,X代表水平縮放,Y代表垂直縮放;
translate(X,Y)為畫布的變換矩陣新增水平的和垂直的偏移;

基本思路:用rotate()方法實現圖片旋轉,用scale()實現縮放。rotate()旋轉的時候是以左上角為頂點進行旋轉,如果想以圖片中心為定點旋轉,用translate()將點定位到圖片中心就好。

本例子以一個黑色矩形來模擬圖片,實現類似的效果。

<!DOCTYPE html>
<html>
    <head>
        <meta
charset="utf-8">
<title></title> <style> body{background: black;} #myCanvas{background: white;} </style> </head> <body> <canvas id="myCanvas" width="400" height="400"></canvas> </body>
<script> window.onload = function(){ var oC = document.getElementById("myCanvas"); var OGC = oC.getContext("2d"); //將方塊起始點向左向下移動100單位 OGC.translate(100,100); //OGC.rotate(45*Math.PI/180); //旋轉以頂點為中心點,旋轉會累加 //等同於旋轉45度
OGC.rotate(20*Math.PI/180); OGC.rotate(25*Math.PI/180); OGC.scale(2,2); //等比放大,寬放大2倍,高放大兩倍 OGC.fillRect(0,0,100,100); }
</script> </html>

基本效果如果圖示:方塊等比放大2倍,並旋轉45度;
這裡寫圖片描述

接下來通過計時器,讓這個方框動起來,在用計時器的時候每次開始要先儲存繪製路徑,並清除畫布大小,結束的時候要用restore()方法清除本次的繪圖,保持始終是一個方框在動。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style>
            body{background: black;}
            #myCanvas{background: white;}
        </style>
    </head>
    <body>
        <canvas id="myCanvas" width="400" height="400"></canvas>
    </body>
    <script>
        window.onload = function(){
            var oC = document.getElementById("myCanvas");
            var OGC = oC.getContext("2d");

            var num = 0;
            var num2 = 0;
            var value = 1;
            setInterval(function(){
                num++;

                OGC.save();
                OGC.clearRect(0,0,oC.width,oC.height);

                OGC.translate(100,100);

                //通過value改變num2值,控制是放大還是縮小
                if (num2 == 100) {
                    value = -1;
                } else if(num2 == 0){
                    value = 1;
                }
                num2+=value;
                OGC.rotate(num*Math.PI/180);

                //將旋轉中心移到圖片中心
                OGC.translate(-50,-50);
                OGC.fillRect(0,0,100,100);

                OGC.restore();
            },30);
        }
    </script>
</html>

效果圖如下,gif看起來有些卡頓,實際執行很流暢,可以直接複製程式碼執行檢視效果:
這裡寫圖片描述