网站首页 > 开源技术 正文
画布操作介绍
画布绘图的环境通过translate,scale,rotate, setTransform和transform来改变,它们会对画布的变换矩阵产生影响。
函数 | 方法 | 描述 |
translate | dx,dx | 转换的量的 X 和 Y 大小 |
scale | sx,sy | 水平和垂直的缩放因子 |
rotate | angle | 旋转的量,用弧度表示。正值表示顺时针方向旋转,负值表示逆时针方向旋转。 |
setTransform | a,b,c,d,e,f | 水平缩放,水平倾斜(与旋转有关),垂直倾斜(与旋转有关,-水平倾斜),垂直缩放,水平移动,垂直移动 |
transform | a,b,c,d,e,f | 水平缩放,水平倾斜,垂直倾斜,垂直缩放,水平移动,垂直移动 |
translate 方法为画布的变换矩阵添加水平的和垂直的偏移。参数 dx和dy添加给后续定义路径中的所有点。
scale 方法为画布的当前变换矩阵添加一个缩放变换。缩放通过独立的水平和垂直缩放因子来完成。例如,传递一个值 2.0 和 0.5 将会导致绘图路径宽度变为原来的两倍,而高度变为原来的 1/2。指定一个负的 sx值,会导致 X 坐标沿 Y 轴对折,而指定一个负的sy会导致 Y 坐标沿着 X 轴对折。
rotate 方法通过指定一个角度,改变了画布坐标和 Web 浏览器中的 <Canvas> 元素的像素之间的映射,使得任意后续绘图在画布中都显示为旋转的。它并没有旋转 <Canvas> 元素本身。注意,这个角度是用弧度指定的。
setTransform 会将当前的变换矩阵重置为单位矩阵,然后构建新的矩阵。
transform 添加一个新的变换矩阵,再次绘制矩形,调用 transform 时,它都会在前一个变换矩阵上构建。
具体使用范例
我们在画布上绘制一个矩形。
1 <!DOCTYPE html> 2 <html> 3 <body> 4 5 <canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;"> 6 Your browser does not support the HTML5 canvas tag. 7 </canvas> 8 9 <script> 10 11 var c=document.getElementById("myCanvas"); 12 var ctx=c.getContext("2d"); 13 14 ctx.fillStyle="yellow"; 15 ctx.fillRect(0,0,250,100) 16 17 </script> 18 19 </body> 20 </html>
然后画出的图形如下图所示:绘制范围就是从坐标(0,0)开始画一个宽高分别为250,100的矩形。
下面对这个矩形进行平移,缩放,旋转等操作。
1 平移
如果往中间平移的话,我们可以改变它的坐标值例如ctx.fillRect(25,25,250,100),就将矩形起始位置移动到了(25,25)。绘制出的效果如下图:
另外还有一种方法,我们可以通过context的translate方法移动画布,来达到同样的视觉效果。未变换前画布的原点在左上角,使用translate方法后相当于整个坐标系在平移。
注:在操作画布变换矩阵时,最好在变换前使用save方法保存记录画布当前状态,完成绘制后可以使用restore方法恢复变换前的矩阵状态。
1 ctx.save; 2 ctx.translate(25,25); 3 ctx.fillStyle="yellow"; 4 ctx.fillRect(0,0,250,100) 5 ctx.restore;
2 缩放
缩放矩形当然可以通过调整宽高的方式这里不再举例说明。
这里主要介绍通过context的scale方法缩放画布的方法,通过以下代码就可以将黄色矩形所缩小到原来的一半(如下图)。
1 ctx.save; 2 ctx.scale(0.5,0.5); 3 ctx.fillStyle="yellow"; 4 ctx.fillRect(25,25,250,100); 5 ctx.restore;
3 旋转
旋转图中矩形,就需要把画布矩阵状态通过rotate方法变换下了。rotate(Math.PI/6)就是将画布顺时针旋转30度,画出的矩形如下图。
1 ctx.save; 2 ctx.rotate(Math.PI/6); 3 ctx.fillStyle="yellow"; 4 ctx.fillRect(25,25,250,100) 5 ctx.restore;
4 确定中心点
通过图可以看出上面的缩放和旋转都是以画布左上角为中心进行的,如果我们需要以画布中心点为中心进行变换,需要在rotate和scale方法调用前去修正画布的坐标原点位置到画布占位的中心位置ranslate(width/2,height/2),然后进行缩放变换,之后再用ranslate(-width/2,-height/2)修正坐标系。如下代码:
1 ctx.save; 2 ctx.translate(width/2,height/2);//将画布坐标系原点移至中心 3 ctx.rotate(0.5,0.5);//如果是缩放,这里是缩放代码 4 ctx.translate(-width/2,-height/2);//修正画布坐标系 5 ctx.fillStyle="yellow"; 6 ctx.fillRect(25,25,250,100) 7 ctx.restore;
效果如下图:
5 设置矩阵
方法setTransform的六个参数上面已经提到,其实可以理解为缩放、旋转、移动的复合方法。当您调用 setTransform 时,它都会重置前一个变换矩阵然后构建新的矩阵,因此在下面的例子中,不会显示红色矩形,因为它在蓝色矩形下面。
1 var c=document.getElementById("myCanvas"); 2 var ctx=c.getContext("2d"); 3 4 ctx.fillStyle="yellow"; 5 ctx.fillRect(0,0,250,100) 6 7 ctx.setTransform(1,Math.PI/6,-Math.PI/6,1,30,10);//两个1代表画布进行缩放,Math.PI/6表示顺时针旋转30度,(30,10)表示平移 8 ctx.fillStyle="red"; 9 ctx.fillRect(0,0,250,100); 10 11 ctx.setTransform(1,Math.PI/6,-Math.PI/6,1,30,10); 12 ctx.fillStyle="blue"; 13 ctx.fillRect(0,0,250,100);
和setTransform类似的还有一个方法transform,它们都有六个参数。但是不同的是每次调用 transform 时,它都会在前一个变换矩阵上构建。如下代码中先绘制的红色矩形和上图的位置是一致的,画完红色矩形后,再次调用transform(1,Math.PI/6,-Math.PI/6,1,30,10)改变画布,这次变换是在当前画布状态上变换的所以画的蓝色矩形不会和红色的重叠。如下图看上去,红色和黄色的相对位置 与 蓝色和红色的相对位置 是一样的。
1 var c=document.getElementById("myCanvas"); 2 var ctx=c.getContext("2d"); 3 4 ctx.fillStyle="yellow"; 5 ctx.fillRect(0,0,250,100) 6 7 ctx.transform(1,Math.PI/6,-Math.PI/6,1,30,10); 8 ctx.fillStyle="red"; 9 ctx.fillRect(0,0,250,100); 10 11 ctx.transform(1,Math.PI/6,-Math.PI/6,1,30,10); 12 ctx.fillStyle="blue"; 13 ctx.fillRect(0,0,250,100);
对canvas绘图感兴趣的,还可以参看此博文http://www.cnblogs.com/fangsmile/p/5644611.html
- 上一篇: 使用Rough.js手绘一棵圣诞树
- 下一篇: 前端几何计算GIS空间分析库介绍及优缺点分析
猜你喜欢
- 2024-12-13 外媒说 | 看看外媒都是如何评价《芭比》这部电影的
- 2024-12-13 用js实现html页面水印
- 2024-12-13 GC-PowerStation使用教程
- 2024-12-13 2023 年 CSS 新特性大盘点
- 2024-12-13 Canvas 从进阶到退学
- 2024-12-13 Qt4/5升级到Qt6吐血经验总结V202308
- 2024-12-13 肝一下Go.js的高级使用—动态显示效果......
- 2024-12-13 如何用FFMpeg生成视频
- 2024-12-13 如何在fabric.js中使用蒙版合成图片
- 2024-12-13 canvas画箭头线
你 发表评论:
欢迎- 05-16东契奇:DFS训练时喷了我很多垃圾话 我不懂他为什么比赛不这么干
- 05-16这两球很伤!詹姆斯空篮拉杆不中 DFS接里夫斯传球空接也没放进
- 05-16湖人自媒体调查:89%球迷希望DFS回归79%希望詹姆斯回归
- 05-16Shams:湖人得到全能球员DFS 节省了1500万奢侈税&薪金空间更灵活
- 05-16G5湖人胜率更高!詹姆斯不满判罚,DFS谈5人打满下半场:这很艰难
- 05-16DFS:当东契奇进入状态 所有防守者在他面前都像个圆锥桶
- 05-16上一场9中6!DFS:不能让纳兹-里德这样的球员那么轻松地投三分
- 05-16WIDER FACE评测结果出炉:滴滴人脸检测DFS算法获世界第一
- 最近发表
-
- 东契奇:DFS训练时喷了我很多垃圾话 我不懂他为什么比赛不这么干
- 这两球很伤!詹姆斯空篮拉杆不中 DFS接里夫斯传球空接也没放进
- 湖人自媒体调查:89%球迷希望DFS回归79%希望詹姆斯回归
- Shams:湖人得到全能球员DFS 节省了1500万奢侈税&薪金空间更灵活
- G5湖人胜率更高!詹姆斯不满判罚,DFS谈5人打满下半场:这很艰难
- DFS:当东契奇进入状态 所有防守者在他面前都像个圆锥桶
- 上一场9中6!DFS:不能让纳兹-里德这样的球员那么轻松地投三分
- WIDER FACE评测结果出炉:滴滴人脸检测DFS算法获世界第一
- 湖人自媒体调查:89%球迷希望DFS回归 79%希望詹姆斯回归
- 一觉醒来湖人苦盼的纯3D终于到位 DFS能带给紫金军多少帮助
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)