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