html部分:

<canvas id="myCanvas" width="800" height="800" ></canvas>

第一部分、保存和恢复绘图状态
画布中,绘图状态指的是描述某一时刻2D渲染上下文外观的整套属性,从简单的颜色值到复杂变换矩阵及其它特性
注意:画布上的当前路径和当前位图(正在显示的内容)不属于状态
1.保存绘图状态:save();
2.恢复绘图状态:restore();

<script type="text/javascript">
    function draw1(id){
        var canvas = document.getElementById(id);
        var context =canvas.getContext("2d");
        var text = "hello world!";
        context.font="30px serif"   // 把文本大小设置为30px

        context.fillStyle = "red";   // 设置文本颜色为红色
        context.fillText(text,40,40);   // 红色文本
        context.save();   // 保存画布状态( 把文字的红色状态保存 )

        context.fillStyle = "yellow";   // 设置文本颜色为黄色
       context.fillText(text,40,80);   // 黄色文本
        context.save();   // 保存画布状态( 把文字的黄色状态保存 )

        context.restore();   // 恢复画布状态
        context.fillText(text,40,120);   // 黄色文本

        context.restore();
        context.fillText(text,40,160);   // 红色文本
    }draw1('myCanvas');
</script>

总结:
当调用save方法保存绘图状态时,2D渲染上下文会保存一个绘图状态栈,最近保存的状态在最顶部,调用restore方法第一个恢复的绘图状态是从栈的最顶部取出的;当栈返回最后一个状态后,会将它清除,使栈变成空的。

上例中最后一个被存入栈的是黄色,所以第一次调用restore方法时显示的文字是黄色,而不是红色;第二次调用restore方法时,才会显示红色文字。

第二部分 变形
注意:每一种变形方法,包括平移,都会影响方法执行后所绘制的所有元素,因为他们都是直接在2D渲染上下文操作的,而不是针对所绘制的图形。

1. 平移 translate(x,y)
x,y是坐标值
移动的是2D渲染上下文的原点,而不是所绘制的对象,如下图:

实例:

<script type="text/javascript">
    function draw1(id){
        var canvas = document.getElementById(id);
        var context =canvas.getContext("2d");

        context.fillRect(10,10,50,50);
        context.translate(60,60);    // 原点坐标从(10,10)移动到(60,60)的位置

        context.fillStyle = "red";
        context.fillRect(10,10,50,50);    // 移动后,原点坐标由原来的(10,10)变成了(70,70)
    }draw1('myCanvas');
</script>

2. 缩放 scale(x,y)
x,y是缩放的倍数,不是像素值。
缩放是调整2D上下文的尺寸。

<script type="text/javascript">
    function draw1(id){
        var canvas = document.getElementById(id);
        var context =canvas.getContext("2d");

        context.fillRect(10,10,50,50);

        context.scale(2,2);     // x,y方向都被放大了2倍

        context.fillStyle = "red";
        context.fillRect(10,10,50,50);     // 放大后
    }draw1('myCanvas');
</script>

上例中,将2D渲染上下文的x方向和y方向都乘以2,所以2D渲染上下文及其所绘制的所有对象都变成了2倍的尺寸
 3.旋转 rotate()
需要传入以弧度为单位的2D渲染上下文旋转角度值。

实例:

<script type="text/javascript">
    function draw1(id){
        var canvas = document.getElementById(id);
        var context =canvas.getContext("2d");

        context.rotate(0.7854);     // 把2D渲染上下文旋转45° (Math.PI/4)

        context.fillStyle = "red";
        context.fillRect(90,90,50,50);     // 旋转画布后 图形出现在了奇怪的区域上
    }draw1('myCanvas');
</script>

  

rotate()把2D渲染上下文绕其原点(0,0)进行旋转,图形本身不会旋转,如下图:

如果只是想旋转所要绘制的图形,还需要配合着tranlate将2D渲染上下文的原点平移到正在绘制的图形中心,然后再对画布执行一次旋转,接着在当前位置绘制图形,
例如:

<script type="text/javascript">
    function draw1(id){
        var canvas = document.getElementById(id);
        var context =canvas.getContext("2d");

        context.translate(400,400);   // 平移到正中心
        context.rotate(0.7854);   // 把2D渲染上下文旋转45° (Math.PI/4)
        context.fillStyle = "red";
        context.fillRect(90,90,50,50);   // 旋转画布后绘制一个图形
    }draw1('myCanvas');
</script>

第三部分 合成
将多个可视化元素合成一个可视化元素
1. 全局阿尔法值 globalAlpha
值:0.0(全透明)~1.0(不透明)之间
默认:1.0
影响将要绘制的对象的透明度

<script type="text/javascript">
    function draw1(id){
        var canvas = document.getElementById(id);
        var context =canvas.getContext("2d");

        context.fillStyle = "red";
        context.fillRect(90,90,50,50);

        context.globalAlpha = 0.2;
        context.fillRect(150,150,50,50);
    }draw1('myCanvas');
</script>

2. 合成操作 globalCompositionPeration
源 :绘制的新图形
目标:已经绘制了图形的2D渲染上下文
1) source-over (默认属性)源在目标之上
2) destination-over 源在目标之下
3) source-atop 源在目标之上,但是重叠区域两者都不透明,绘制在其他位置的目标不透明,源透明(不可见)
4) destination-atop 源在目标之下,但是重叠区域两者都不透明,绘制在其他位置的源不透明,目标透明(不可见)
5) source-in 源与目标重叠的部分只绘制源,不重叠的部分都变成透明
6) destination-in 源与目标重叠的部分只绘目标,不重叠的部分都变成透明
7) source-out 与目标不重叠的区域绘制源,其他部分变成透明
8) destination-out 与目标不重叠的区域绘制目标,其他部分变成透明
9) lighter 与顺序无关,如果源与目标重叠,就将两者颜色值相加,得到颜色值的最大值为255,结果就是白色
10)copy 与顺序无关,只绘制源,覆盖掉目标
11)xor 与顺序无关,只绘制不重叠区域,重叠区域透明

<script type="text/javascript">
    function draw1(id){
        var canvas = document.getElementById(id);
        var context =canvas.getContext("2d");

        context.fillStyle = "rgb(63,169,245)";     // 目标
        context.fillRect(90,90,150,150);

        context.globalCompositeOperation = "source-over";
        context.fillStyle = "rgb(225,123,172)";     // 源
        context.fillRect(150,150,150,150);
    }draw1('myCanvas');
</script>

第四部分 阴影
shadowBlur 模糊值
shadowOffsetX x轴方向阴影偏移
shadowOffsetY y轴方向阴影偏移
shadowColor 模糊颜色

<script type="text/javascript">
    function draw1(id){
        var canvas = document.getElementById(id);
        var context =canvas.getContext("2d");

        context.shadowBlur=20;   // 20px 模糊值
        context.shadowColor="red";   // 模糊颜色
        context.shadowOffsetX = 10;
        context.shadowOffsetY = 10;
        context.fillRect(20,20,150,150);
    }draw1('myCanvas');
</script>

  

第五部分 渐变
1. 线性渐变 createLinearGradient(x0,y0,x1,y1)
参数 :渐变起点x,y坐标
渐变终点x,y坐标
2. 放射渐变 createRadialGradient(x0,y0,r0,x1,y1,r1)
参数:前三个描述开始圆
后三个描述结束圆
每一个圆的(x,y)表示圆心坐标,r表示半径
实现渐变效果是连接两个圆周的椎体,开始圆之前的部分显示偏移量为0的颜色,结束圆之后的部分显示偏移量为1的颜色值
注:为了实现最佳效果,开始圆和结束圆放在同一个位置
返回:CanvasGradient对象
加颜色:addColorStop()
参数:颜色偏移值(0:渐变起点;1:渐变终点)
偏移量颜色值
fillStyle和storeStyle都可以接受CanvasGradient对象表示的渐变颜色值
实例一:线性渐变

<script type="text/javascript">
    function draw1(id){
        var canvas = document.getElementById(id);
        var context =canvas.getContext("2d");

        var gradient = context.createLinearGradient(0,0,0,800);   // 渐变区域:左上角(0,0)开始到左下角(0,800)结束
        gradient.addColorStop(0,'blue');
        gradient.addColorStop(1,'yellow');
        context.fillStyle = gradient;
        context.fillRect(0,0,800,800);
    }draw1('myCanvas');
</script>

实例二:放射渐变

<script type="text/javascript">
    function draw1(id){
        var canvas = document.getElementById(id);
        var context =canvas.getContext("2d");

        var gradient = context.createRadialGradient(500,500,100,500,500,500);     // 为了实现最佳效果,开始圆和结束圆放在同一个位置
        gradient.addColorStop(0,'blue');
        gradient.addColorStop(1,'yellow');
        context.fillStyle = gradient;
        context.fillRect(0,0,800,800);
    }draw1('myCanvas');
</script>

  

第六部分 复杂路径
如何将多个路径链接在一起?
不断的调用lineTo();
moveTo 会创建一条全新的子路径
lineTo 只是沿着一条已经有的子路径继续画线

<script type="text/javascript">
    function draw1(id){
        var canvas = document.getElementById(id);
        var context =canvas.getContext("2d");

        context.beginPath();
        context.moveTo(100,50);
        context.lineTo(30,150);
        context.lineTo(160,150);
        context.closePath();
        context.stroke();
        context.fill();
    }draw1('myCanvas');
</script>

  

2、贝塞尔曲线
quadraticCurveTo()
参数:
控制点的(x,y)坐标
路径目标点的(x,y)坐标
二次贝塞尔曲线,只有一个控制点(线条中只有一次弯曲)
bezierCurveTo()
参数:
第一个控制点(x,y)的坐标
第二个控制点(x,y)的坐标
路径目标点(x,y)的坐标
三次贝塞尔曲线,两个控制点(两次弯曲)
 实例:二次

<script type="text/javascript">
    function draw1(id){
        var canvas = document.getElementById(id);
        var context =canvas.getContext("2d");
        context.lineWidth=5;
        context.beginPath();
        context.moveTo(50,250);
        context.quadraticCurveTo(250,100,450,250);
        context.stroke();
    }draw1('myCanvas');
</script>

  

实例:三次

<script type="text/javascript">
    function draw1(id){
        var canvas = document.getElementById(id);
        var context =canvas.getContext("2d");
        context.lineWidth=5;
        context.beginPath();
        context.moveTo(50,250);
        context.bezierCurveTo(150,50,350,450,450,250);
        context.stroke();
    }draw1('myCanvas');
</script>

  

以上是学习时候做的笔记,如果哪里有问题,欢迎指正,不甚感激!

参考资料  < HTML5  CANVAS基础教程 >

canvas 基础知识整理(二)的更多相关文章

  1. canvas 基础知识整理(一)

    canvas这个 HTML 元素是为了客户端矢量图形而设计的.它自己没有行为,但却把一个绘图 API 展现给客户端 JavaScript 以使脚本能够把想绘制的东西都绘制到一块画布上. html的基本 ...

  2. canvas API ,通俗的canvas基础知识(二)

    上文我们讲到了画一条线,画矩形,写文字,总算是有了一个好的开头,如果还没有看的同学出门左转,先看看那篇,这里就不多做叙述了,接下来我们看比较复杂的一些属性和方法! 讲之前呢,我还是想温习一下,毕竟上文 ...

  3. Kali Linux渗透基础知识整理(二)漏洞扫描

    Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...

  4. Kali Linux渗透基础知识整理(四):维持访问

    Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...

  5. 【OGG】OGG基础知识整理

    [OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...

  6. Java JDBC的基础知识(二)

    在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...

  7. java部分基础知识整理----百度脑图版

    近期发现,通过百度脑图可以很好的归纳总结和整理知识点,本着学习和复习的目的,梳理了一下java部分的知识点,不定期更新,若有不恰之处,请指正,谢谢! 脑图链接如下:java部分基础知识整理----百度 ...

  8. LeetCode刷题191130 --基础知识篇 二叉搜索树

    休息了两天,状态恢复了一下,补充点基础知识. 二叉搜索树 搜索树数据结构支持许多动态集合操作,包括Search,minimum,maximum,predecessor(前驱),successor(后继 ...

  9. canvas基础知识

    canvas基础知识 ## CanvasDOM对象 #### 获取绘图环境```canvas.getContext();``` #### 设置宽和高```canvas.width = 500;canv ...

随机推荐

  1. 返回指定的VC

    for (UIViewController *controller in self.navigationController.viewControllers) {            if ([co ...

  2. 【翻译】口袋妖怪X/Y 制作技法

    口袋妖怪X/Y [口袋妖怪]系列最终的全3D化     再现图像风格的制作技法   完成系列最初的全3D化的本作,在手掌游戏机的性能和容量的限制中,把杉森建氏的公式设定图风格用Toon Shading ...

  3. Unity3D之游戏架构脚本该如何来写(转)

    这篇文章主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难.这篇文章的目的是让哪些已经上手Unity3D游戏引擎的朋友 ...

  4. DateTime Related Functions

    string a = "to_date('" + dtpStart.Value.ToString("yyyy/MM/dd") + "', 'yyyy/ ...

  5. Oracle数据库常用命令

    导出表数据 exp user/pwd@dbname file=filename.dmp tables=tbl_name rows=y indexes=n triggers=n grants=n 导入表 ...

  6. MVC设计模式

    随着Web应用的商业逻辑包含逐渐复杂的公式分析计算.决策支持等,使客户机越 来越不堪重负,因此将系统的商业分离出来.单独形成一部分,这样三层结构产生了. 其中‘层’是逻辑上的划分. 三层体系结构是将整 ...

  7. redis 应用场景

    1.string类型 : 图片和视频文件,静态文件 2.list 双向链表:回帖ID,我的关注列表,消息队列 length = redis.lpush('users:newest', 'user:go ...

  8. delphi 数组类型与数组指针的巧妙利用

    {本例通过存取结构, 慢慢引入了数组类型与指针的一些使用方法; 其中六个小例子的测试内容和结果都是一样的. ---------------------------------------------- ...

  9. 【No.1】监控Linux性能25个命令行工具

    如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?通过以下命令或者工具可以快速定位 top vmstat lsof tcpdump netsta ...

  10. 深入了解Windows句柄到底是什么

    深入了解Windows句柄到底是什么 http://blog.csdn.net/wenzhou1219/article/details/17659485 总是有新入门的Windows程序员问我Wind ...