canvas之图形的变化

1、保存与恢复canvas状态

ctx.save();暂时将当前的状态保存到堆中

ctx.restore();该方法用于将上一个保存的状态从堆中再次取出,恢复该状态的所有设置。

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="utf-8">
 5 <title></title>
 6 <style type="text/css">
 7 *{padding: 0;margin:0;}
 8 body{background: #1b1b1b;}
 9 #div1{margin:50px auto; width:300px; height: 300px;}
10 canvas{background: #fff;}
11 </style>
12 <script type="text/javascript">
13 window.onload = function(){
14     var c = document.getElementById(‘myCanvas‘);
15     var context = c.getContext(‘2d‘);
16
17     //开始绘制矩形
18     context.fillStyle = ‘#f0f‘;
19     context.strokeStyle = ‘blue‘;
20     context.fillRect(20,20,100,100);
21     context.strokeRect(20,20,100,100);
22     context.fill();
23     context.stroke();
24
25     //保存当前canvas状态
26     context.save();
27
28     //绘制另外一个矩形
29     context.fillStyle = ‘#f00‘;
30     context.strokeStyle = ‘green‘;
31     context.fillRect(140,20,100,100);
32     context.strokeRect(140,20,100,100);
33     context.fill();
34     context.stroke();
35
36     //恢复第一个矩形的状态
37     context.restore();
38
39     //绘制两个矩形
40     context.fillRect(20,140,50,50);
41     context.strokeRect(80,140,50,50);
42
43 };
44 </script>
45 </head>
46 <body>
47     <div id="div1">
48         <canvas id="myCanvas" width="300" height="200"></canvas>
49     </div>
50 </body>
51 </html>

效果展示:

2、移动坐标空间

context.translate(dx,dy); dx,dy分别表示坐标原点沿水平和垂直两个方向的偏移量。(在图形变换之前,最好使用save()方法保存当前状态的好习惯。使用restore()方法恢复原来的状态)。

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="utf-8">
 5 <title></title>
 6 <style type="text/css">
 7 *{padding: 0;margin:0;}
 8 body{background: #1b1b1b;}
 9 #div1{margin:50px auto; width:300px; height: 300px;}
10 canvas{background: #fff;}
11 </style>
12 <script type="text/javascript">
13 window.onload = function(){
14     draw();
15 };
16 function drawTop(ctx,fillStyle){
17     ctx.fillStyle = fillStyle;
18     ctx.beginPath();
19     ctx.arc(0,0,30,0,Math.PI,true);
20     ctx.closePath();
21     ctx.fill();
22 }
23
24 function drawGrip(ctx){
25     ctx.save();
26     ctx.fillStyle = ‘blue‘;
27     ctx.fillRect(-1.5,0,1.5,40);
28     ctx.beginPath();
29     ctx.arc(-5,40,4,Math.PI,Math.PI*2,true);
30     ctx.stroke();
31     ctx.closePath();
32     ctx.restore();
33 }
34
35 function draw(){
36
37     var ctx = document.getElementById(‘myCanvas‘).getContext(‘2d‘);
38     ctx.translate(80,80);
39
40     for(var i=0; i<10; i++){
41         ctx.save();
42         ctx.translate(60*i,0);
43         drawTop(ctx,‘rgb(‘+(30*i)+‘,‘+(255-30*i)+‘,255)‘);
44         drawGrip(ctx);
45         ctx.restore();
46     }
47
48 }
49 </script>
50 </head>
51 <body>
52     <div id="div1">
53         <canvas id="myCanvas" width="700" height="300"></canvas>
54     </div>
55 </body>
56 </html>

效果展示:

3、旋转坐标空间

context.rotate(angle);  该方法只有一个参数 旋转角度angle,旋转角度以顺时针方向为正方向,以弧度为单位,旋转中心为canvas的原点

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="utf-8">
 5 <title></title>
 6 <style type="text/css">
 7 *{padding: 0;margin:0;}
 8 body{background: #1b1b1b;}
 9 #div1{margin:50px auto; width:300px; height: 300px;}
10 canvas{background: #fff;}
11 </style>
12 <script type="text/javascript">
13 window.onload = function(){
14     draw();
15 };
16 function drawTop(ctx,fillStyle){
17     ctx.fillStyle = fillStyle;
18     ctx.beginPath();
19     ctx.arc(0,0,30,0,Math.PI,true);
20     ctx.closePath();
21     ctx.fill();
22 }
23 function drawGrip(ctx){
24     ctx.save();
25     ctx.fillStyle = ‘blue‘;
26     ctx.fillRect(-1.5,0,1.5,40);
27     ctx.beginPath();
28     ctx.strokeStyle = ‘blue‘;
29     ctx.arc(-5,40,4,Math.PI,Math.PI*2,true);
30     ctx.stroke();
31     ctx.closePath();
32     ctx.restore();
33 }
34 function draw(){
35     var c = document.getElementById(‘myCanvas‘);
36     var ctx = c.getContext(‘2d‘);
37     ctx.translate(150,150);
38
39     for(var i=0; i<8; i++){
40         ctx.save();
41         ctx.rotate(Math.PI*(2/4+i/4));
42         ctx.translate(0,-100);
43         drawTop(ctx,‘rgb(‘+(30*i)+‘,‘+(255-30*i)+‘,255)‘);
44         drawGrip(ctx);
45         ctx.restore();
46     }
47 }
48 </script>
49 </head>
50 <body>
51     <div id="div1">
52         <canvas id="myCanvas" width="300" height="300"></canvas>
53     </div>
54 </body>
55 </html>

效果展示:

4、缩放图形

ctx.scale(x,y); 其中x为x轴的缩放,y为y轴的缩放,如果要缩小,值为小于1的数值,如果要放大,值为大于1的数值。

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="utf-8">
 5 <title></title>
 6 <style type="text/css">
 7 *{padding: 0;margin:0;}
 8 body{background: #1b1b1b;}
 9 #div1{margin:50px auto; width:300px; height: 300px;}
10 canvas{background: #fff;}
11 </style>
12 <script type="text/javascript">
13 window.onload = function(){
14     draw();
15 };
16
17 function draw(){
18     var c = document.getElementById(‘myCanvas‘);
19     var ctx = c.getContext(‘2d‘);
20     ctx.translate(180,20);
21
22     for(var i=0; i<80; i++){
23         ctx.save();
24         ctx.translate(30,30);
25         ctx.scale(0.95,0.95);
26         ctx.rotate(Math.PI/12);
27         ctx.beginPath();
28         ctx.fillStyle = ‘red‘;
29         ctx.globalAlpha = ‘0.4‘;
30         ctx.arc(0,0,50,0,Math.PI*2,true);
31         ctx.closePath();
32         ctx.fill();
33     }
34 }
35 </script>
36 </head>
37 <body>
38     <div id="div1">
39         <canvas id="myCanvas" width="300" height="300"></canvas>
40     </div>
41 </body>
42 </html>

效果展示:

5、矩阵变换

transform方法用于直接对变形矩阵作修改,即进行矩阵变形。

context.transform(m11,m12,m21,m22,dx,dy);   该方法必须将当前的变换矩阵与下面的矩阵进行乘法运算。

即:

m11(默认为1) m21(默认为0) dx
m12(默认为0) m22(默认为1) dy
0 0 1

也就是说假设A(x,y)要变换成B(x’,y’)可以通过乘以上述矩阵即可得到。

一:平移(translate)

时间: 2024-08-01 12:24:20

canvas之图形的变化的相关文章

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf8

第6章 精灵 精灵(sprite),它是一种可以集成入动画之中的图像对象,赋予它们各种行为,精灵并非Canvas API的一部分,,但都是从它衍生而来 本章将会实现三种设计模式:策略模式(精灵与绘制器解耦).命令模式(精灵的动作).享元模式(一个实例表示多个精灵) painter属性是一个指向Painter对象的引用,使用paint(sprite,context)方法来绘制精灵,behaviors属性指向一个对象数组,数组中每个对象都会以execute(sprite,context,time)方

html5 Canvas绘制图形入门详解

html5,这个应该就不需要多作介绍了,只要是开发人员应该都不会陌生.html5是「新兴」的网页技术标准,目前,除IE8及其以下版本的IE浏览器之外,几乎所有主流浏览器(FireFox.Chrome.Opera.Safari.IE9+)都已经开始支持html5了.除此之外,在移动浏览器市场上,众多的移动浏览器也纷纷展开关于「html5的支持能力以及性能表现」的军备竞赛.html作为革命性的网页技术标准,再加上众多浏览器厂商或组织的鼎力支持,可以想见,html5将会成为未来网页技术的领头羊. ht

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf5

文本的定位 水平与垂直定位:当使用strokeText()和fillText()绘制文本时,指定了所绘文本的X与Y坐标,还有textAlign与textBaseline两个属性 textAlign:start(默认) center end left right,当canvas元素的dir属性是ltr时,left效果与start相同,right与end相同,如果dir属性是rtl,则相反 textBaseline:top bottom middle alphabetic(默认,基于拉丁字母) id

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf4

CanvasRenderingContext2D对象中用于平移.旋转坐标系的方法 镜像 scale(1,-1)绘制垂直镜像:scale(-1,1)绘制水平镜像 自定义的坐标变换 transform(),多次调用会叠加效果 setTransform(),每次调用都会清除上次的效果 两个方法都用于旋转.缩放.及平移坐标系(可以根据公式传入0或其他数据) x'=ax+cy+e y'=bx+dy+f 坐标系旋转公式(angle弧度) x'=x×cos(angle)-(y×sin(angle)) y'=y

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf1

canvas元素可以说是HTML5元素中功能最强大的一个,它真正的能力是通过Canvas的context对象(绘图上下文)表现出来的 fillText()方法使用fillStyle属性来填充文本中的字符,strokeText()方法使用strokeStyle属性描绘字符的轮廓线,fillStyle属性和strokeStyle属性可以是CSS格式的颜色.渐变色或是图片 fillText()与strokeText()方法都需要3个参数:要绘制的文本内容,以及在canvas中显示文本的横.纵坐标 注意

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf7

性能 运行putImageData()比drawImage()慢,同等条件下优先考虑drawImage() 操作图像数据需要遍历大量数据,应该注意几点: 1)避免在循环体中直接访问对象属性,应当保存在局部变量中 2)应该用循环计数器遍历完整的像素,而非像素分量(每4个一组) 3)逆向遍历与移位技巧效果并不好 4)不要频繁使用getImagedata() 视频处理 var video=document.getElementById('video'); //A <video>element ...

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf3

路径与子路径 在某一时刻,canvas之中只能有一条路径存在,Canvas规范称之为“当前路径”(current path),这条路径却可以包含很多子路径(subpath),子路径是由两个或者更多点组成的 context.beginPath(); context.rect(10,10,100,100); context.stroke(); context.beginPath(); //清除上次调用rect()方法所创建的路径 context.rect(50,50,100,100); contex

HTML5—canvas绘制图形(1)

1.canvas基础知识 canvas元素是HTML5中新增的一个重要的元素,专门用来绘制图形,不过canvas本身不具备画图的能力,在页面中放置了canvas元素,就相当于在页面中放置了一块矩形的“画布”,我们可以利用js脚本在“画布”上绘制图形. 1.1canvas元素 在利用canvas绘制图形之前,我们首先需要在页面中放置一个canvas元素,如下代码: <canvas id="mycanvas" width="400" height="40

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf6

操作图像的像素:getImageData() putImageData() ImageData对象 调用getImageData()方法实际是获取了一个指向ImageData对象的引用,返回的对象包含3个属性:1)width以设备像素为单位的图像数据宽度 2)height以设备像素为单位的图像数据高度 3)data包含各个设备像素数值的数组 width和height都是只读的无符号长整数,data属性包含的每个数组元素都表示图像数据中相应的像素值,每个值包含的颜色分量都是含有8个二进制位的整数(