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
html5 canvas常用api总结(三)--图像变换API的更多相关文章
- html5 canvas常用api总结(一)
1.监听浏览器加载事件. window.addEventListener("load",eventWindowLoaded,false); load事件在html页面加载结束时发生 ...
- html5 canvas常用api总结(二)--绘图API
canvas可以绘制出很多奇妙的样式和美丽的效果,通过几个简单的api就可以在画布上呈现出千变万化的效果,还可以制作网页游戏,接下来就总结一下和绘图有关的API. 绘画的时候canvas相当于画布,而 ...
- ROS常用库(三)API学习之常用common_msgs(上)
一.概述 common_msgs包含其他ROS软件包广泛使用的消息.这些消息包括动作消息(actionlib_msgs),诊断消息(diagnostic_msgs),几何图元(geometry_msg ...
- HTML5 Canvas游戏开发(三)lufylegend开源库件(上)
lufylegend可以解决HTML5开发游戏中会遇到的一些问题: 1.各种浏览器对于JavaScript和HTML的解析是不一致的. 2.手机浏览器和PC浏览器的区别. 3.JavaScript并非 ...
- ROS常用库(四)API学习之常用common_msgs(下)
一.前言 承接ROS常用库(三)API学习之常用common_msgs(上). 二.sensor_msgs 1.sensor_msgs / BatteryState.msg #电源状态 uint8 P ...
- [js高手之路] html5 canvas系列教程 - 掌握画直线图形的常用API
我们接着上文[js高手之路] html5 canvase系列教程 - 认识canvas以及基本使用方法继续. 一.直线的绘制 cxt.moveTo( x1, y1 ): 将画笔移动到x1, y1这个点 ...
- HTML5 程序设计 - 使用HTML5 Canvas API
请你跟着本篇示例代码实现每个示例,30分钟后,你会高喊:“HTML5 Canvas?!在哥面前,那都不是事儿!” 呵呵.不要被滚动条吓到,很多都是代码和图片.我没有分开写,不过上面给大家提供了目录,方 ...
- html5 Canvas API
详细内容请点击 1.HTML Canvas API有两方面优势可以弥补:首先,不需要将所绘制图像中的每个图元当做对象存储,因此执行性能非常好:其次,在其他编程语言现有的优秀二维绘图API的基础上实现C ...
- 使用HTML5 Canvas API
一.检测浏览器支持情况 HTML5 Canvas的确是一个好东西,但是并不是所有浏览器都支持HTML5 Canvas的,这就要求我们在使用HTML5 Canvas前要检查浏览器是否支持这玩意儿. 在创 ...
随机推荐
- In-Memory:在内存中创建临时表和表变量
在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...
- 几个有趣的WEB设备API(二)
浏览器和设备之间还有很多有趣的接口, 1.屏幕朝向接口 浏览器有两种方法来监听屏幕朝向,看是横屏还是竖屏. (1)使用css媒体查询的方法 /* 竖屏 */ @media screen and (or ...
- CENTOS 6.5 平台离线编译安装 PHP5.6.6
一.下载php源码包 http://cn2.php.net/get/php-5.6.6.tar.gz/from/this/mirror 二.编译 编译之前可能会缺少一些必要的依赖包,加载一个本地yum ...
- Android性能优化之利用Rxlifecycle解决RxJava内存泄漏
前言: 其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学 ...
- javascript 判断参数类型大全
js 判断类型的在开发中是很常用的,因为js 是弱类型的语言,var 可以接受任何形式的类型,但是在真正的开发中,我们需要根据不同类型做不同的处理,所以这个是必须的精通. 首先需要知道 typeof这 ...
- 界面设计技法之css布局
css布局之于页面就如同ECMAScript之于JS一般,细想一番,html就如同语文,css就如同数学,js呢,就是物理,有些扯远,这里就先不展开了. 回到主题,从最开始的css到如今的sass(l ...
- 去IOE的一点反对意见以及其他
某天在机场听见两老板在聊天,说到他们目前销售的报表老跟不上的问题,说要请一个人,专门合并和分析一些发过来的excel表格,我真想冲上去说,老板,你需要的是一个信息处理的系统,你需要咨询么.回来一直耿耿 ...
- Oracle常用SQL函数整理
--返回ASCII码select ASCII('A') "A的ASCII码" ,ASCII('a') "a的ASSCII码" from dual ; --反向 ...
- Jenkins的一个bug-同时build一个项目两次导致失败
我们有一个job A, A只是配置了一些参数,它会去触发模板job B. 我一开始点击构建A, 马上发现参数配置不对,于是撤消了构建,但是我没有发现B已经被触发,我重新配置参数,然后再次构建A,这个时 ...
- javaMail
JavaMail概述: JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. javaMai ...