html5 canvas常用api總結(三)--圖像變換API


canvas的圖像變換api,可以幫助我們更加方便的繪畫出一些酷炫的效果,也可以用來制作動畫。接下來將總結一下canvas的變換方法,文末有一個例子來更加深刻的了解和利用這幾個api。

 

1.畫布旋轉api

這里要先了解另一個api

translate(x,y):重新定義畫布上(0,0)的位置。

 

首先定義一個旋轉的角度a,比如想要旋轉45度。

a=45*Math.PI/180

rotate(a):rotate的旋轉參數是弧度。注意,旋轉之前要先設定旋轉的中心點。

function cxt_rotate() {
        var ctx = document.getElementById("trascanvas0").getContext("2d");
        ctx.save();
        ctx.fillStyle="#396";
        var angle=-45*Math.PI/180;
        ctx.translate(150,150);//定義中心點
        ctx.rotate(angle);//旋轉
        ctx.fillRect(-75,-50,100,100);//畫圖
        ctx.restore();
};

這里要注意,rotate函數寫了之后,才會旋轉,如果提前畫圖,再寫rotate會發現並沒有什么卵用……

畫圖的時候,由於我們重新定義了(0,0)點,所有我們畫圖的時候,起始點要減去長和寬的一半。

 

2.平移api

translate(x,y):第一個參數是X軸的平移大小,第二個參數是Y軸的平移大小。

function cxt_translate() {
        var ctx = document.getElementById("trascanvas1").getContext("2d");
        ctx.fillStyle="#987";
        ctx.translate(100,200);
        ctx.fillRect(0,0,50,100);

};

translate這個api講回話遠點移動到參數的位置,把這里當做(0,0)開始回話,經常用在放大縮小,旋轉等變換中設置中心點。

2.縮放api

scale(x,y):第一個參數是X軸的縮放值,第二個參數是Y軸的縮放值。

function cxt_scale() {
        var ctx = document.getElementById("trascanvas2").getContext("2d");
        ctx.fillStyle="#666";
        ctx.fillRect(0,0,100,100);
        ctx.fillStyle="#693";
        ctx.scale(2,2);
        ctx.globalCompositeOperation ="destination-atop";//合成
        ctx.fillRect(0,0,100,100);
        
};

圖中灰色的圖是正常大小,綠色的是經過scale放大的。

注意:代碼中globalCompositeOperation這個api是用來處理兩個圖之間的合成關系的。

 

3.變換矩陣transform&setTransform

context.transform(a,b,c,d,e,f):

context.setTransform(a,b,c,d,e,f):

a:水平縮放,b:水平傾斜,c:垂直傾斜,d:垂直縮放,e:水平位移,f:垂直移動

當圖經過了很多次變換之后,我們可以在變換的前后使用save()&restore()來保存狀態,或者直接在變換前使用setTransform(1,0,0,1,0,0)來重置畫布。

 

function cxt_transform() {
        var ctx = document.getElementById("trascanvas3").getContext("2d");
        ctx.save();
        ctx.fillStyle="yellow";
        ctx.fillRect(0,0,250,100)

        ctx.setTransform(1,0.5,-0.5,1,30,10);
        ctx.fillStyle="red";
        ctx.fillRect(0,0,250,100);

        ctx.transform(1,0.5,-0.5,1,30,10);
        ctx.fillStyle="blue";
        ctx.fillRect(0,0,250,100);

        ctx.restore();
        //ctx.setTransform(1,0,0,1,0,0);

        ctx.fillStyle="yellow";
        ctx.translate(300,0);
        ctx.fillRect(0,0,250,100);

};

 

可以看到,最后一個黃色矩形按照正常的方式顯示在(300,0)的位置。藍色矩形則是在紅色矩形的基礎上變化。我們把上圖的紅色代碼換成:ctx.setTransform(1,0.5,-0.5,1,30,10);

可以看到結果如下:

由於在藍色部分重置了變換矩陣,重新構建了矩陣,所以紅色矩型被藍色矩形遮蓋了。

所以我們看到setTransform()和transform之間的差別就是,前者會重置上次變換然后重新構建新的變換矩陣,而后者直接在上次的變換基礎上構建新的變換。

 

合成--如何擺放兩個重疊的圖層

context.globalCompositeOperation="source-in";

源圖形:要繪制在畫布上的形狀。

目標圖形:已經顯示在畫布上的圖。

這個api有很多的屬性:(綠色為即將畫的,灰色為已經在畫布上的)

source-over:默認。重疊部分,要繪制的在已有的圖上面,其他正常顯示:

 

source-atop:要繪制的部分和畫布上已有的圖重疊顯示要畫的,其余顯示已有的,要畫的不顯示

 

source-in:要繪制的和畫布上已有的圖重疊,只顯示重疊部分,要畫的在上面。

source-out:要繪制的和畫布上已有的圖重疊,只繪制和要繪制圖和已有圖不重疊的部分,其余透明。

 

destination-over:展示所有的圖,重疊部分展示畫布上已有的。

destination-atop:兩者都重疊的地方顯示已經繪制在畫布上的,如果將畫的大,則未重疊部分顯示即將畫的。

destination-in:兩者重疊只顯示重疊部分的已經繪制在畫布上的圖。即將畫的不顯示。

destination-out:兩者重疊,重疊部分不顯示,未重疊的顯示已經繪制在畫布上的圖。

lighter:顯示兩者的混合之后的圖。顏色疊加。

 

copy:顯示源圖,忽略已經畫在畫布上的。

xor: 異或兩個圖形。重疊部分不顯示。

 

以上就是canvas關於變換的api,要提出的一點是,如果使用css給canvas設定大小,則會放大或縮小canvas,導致內容模糊,所以給canvas設定大小的時候要用一下方法:

<canvas id="trascanvas" width="800" height="400"></canvas>

 

文中所有的demo請點擊查看。

也可以在github上找到源碼: https://github.com/jiajiakitten/canvasdemo

 

 

 

 

內容原創,轉載請注明出處:

作者:Jess_喵

來源:http://www.cnblogs.com/zhangwenjiajessy/p/6168420.html


免責聲明!

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



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