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的更多相关文章

  1. html5 canvas常用api总结(一)

    1.监听浏览器加载事件. window.addEventListener("load",eventWindowLoaded,false); load事件在html页面加载结束时发生 ...

  2. html5 canvas常用api总结(二)--绘图API

    canvas可以绘制出很多奇妙的样式和美丽的效果,通过几个简单的api就可以在画布上呈现出千变万化的效果,还可以制作网页游戏,接下来就总结一下和绘图有关的API. 绘画的时候canvas相当于画布,而 ...

  3. ROS常用库(三)API学习之常用common_msgs(上)

    一.概述 common_msgs包含其他ROS软件包广泛使用的消息.这些消息包括动作消息(actionlib_msgs),诊断消息(diagnostic_msgs),几何图元(geometry_msg ...

  4. HTML5 Canvas游戏开发(三)lufylegend开源库件(上)

    lufylegend可以解决HTML5开发游戏中会遇到的一些问题: 1.各种浏览器对于JavaScript和HTML的解析是不一致的. 2.手机浏览器和PC浏览器的区别. 3.JavaScript并非 ...

  5. ROS常用库(四)API学习之常用common_msgs(下)

    一.前言 承接ROS常用库(三)API学习之常用common_msgs(上). 二.sensor_msgs 1.sensor_msgs / BatteryState.msg #电源状态 uint8 P ...

  6. [js高手之路] html5 canvas系列教程 - 掌握画直线图形的常用API

    我们接着上文[js高手之路] html5 canvase系列教程 - 认识canvas以及基本使用方法继续. 一.直线的绘制 cxt.moveTo( x1, y1 ): 将画笔移动到x1, y1这个点 ...

  7. HTML5 程序设计 - 使用HTML5 Canvas API

    请你跟着本篇示例代码实现每个示例,30分钟后,你会高喊:“HTML5 Canvas?!在哥面前,那都不是事儿!” 呵呵.不要被滚动条吓到,很多都是代码和图片.我没有分开写,不过上面给大家提供了目录,方 ...

  8. html5 Canvas API

    详细内容请点击 1.HTML Canvas API有两方面优势可以弥补:首先,不需要将所绘制图像中的每个图元当做对象存储,因此执行性能非常好:其次,在其他编程语言现有的优秀二维绘图API的基础上实现C ...

  9. 使用HTML5 Canvas API

    一.检测浏览器支持情况 HTML5 Canvas的确是一个好东西,但是并不是所有浏览器都支持HTML5 Canvas的,这就要求我们在使用HTML5 Canvas前要检查浏览器是否支持这玩意儿. 在创 ...

随机推荐

  1. npm 私有模块的管理使用

    你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 np ...

  2. 算法与数据结构(八) AOV网的关键路径

    上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...

  3. ASP.NET MVC开发日常一:SessionID合理清除

    在MVC Web开发中临时存储数据一般会用到Session,Cookie,ViewBag,ViewData,TempData.每个的使用场景是不同,具体区别有空再补上. Session数据最敏感,最需 ...

  4. js数组学习整理

    原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...

  5. ,net core mvc 文件上传

    工作用到文件上传的功能,在这个分享下 ~~ Controller: public class PictureController : Controller { private IHostingEnvi ...

  6. MVC还是MVVM?或许VMVC更适合WinForm客户端

    最近开始重构一个稍嫌古老的C/S项目,原先采用的技术栈是『WinForm』+『WCF』+『EF』.相对于现在铺天盖地的B/S架构来说,看上去似乎和Win95一样古老,很多新入行的,可能就没有见过经典的 ...

  7. ObserverPattern(观察者模式)

    import java.util.ArrayList; import java.util.List; /** * 观察者模式 * @author TMAC-J * 牵一发而动全身来形容观察者模式在合适 ...

  8. git提交项目到已存在的远程分支

    今天想提交项目到github的远程分支上,那个远程分支是之前就创建好的,而我的本地关联分支还没创建.   之前从未用github提交到远程分支过,弄了半个钟,看了几篇博文,终于折腾出来.现在把步骤整理 ...

  9. Ubuntu安装redis并配置远程、密码以及开启php扩展

    一.前言 redis是当前流行的nosql数据库,很多网站都用它来做缓存,今天我们来安装并配置下redis 二.安装并配置redis 1.安装redis sudo apt-get install re ...

  10. Linux系统中的Device Mapper学习

    在linux系统中你使用一些命令时(例如nmon.iostat 如下截图所示),有可能会看到一些名字为dm-xx的设备,那么这些设备到底是什么设备呢,跟磁盘有什么关系呢?以前不了解的时候,我也很纳闷. ...