来源:http://www.ido321.com/986.html

一、图形渐变(均在最新版Google中测试)

1、绘制线性渐变

   1: // 获取canvas 的ID
   2:     var canvas = document.getElementById('canvas');
   3:     if (canvas == null)
   4:     {
   5:         return false;
   6:     }
   7:     // 获取上下文
   8:     var context = canvas.getContext('2d');
   9:     // 获取渐变对象
  10:     var g1 = context.createLinearGradient(0,0,0,300);
  11:     // 添加渐变颜色
  12:     g1.addColorStop(0,'rgb(255,255,0)');
  13:     g1.addColorStop(1,'rgb(0,255,255)');
  14:     context.fillStyle = g1;
  15:     context.fillRect(0,0,400,300);
  16:     var g2 = context.createLinearGradient(0,0,300,0);
  17:     g2.addColorStop(0,'rgba(0,0,255,0.5)');
  18:     g2.addColorStop(1,'rgba(255,0,0,0.5)');
  19:     for(var i = 0; i<10;i++)
  20:     {
  21:         context.beginPath();
  22:         context.fillStyle=g2;
  23:         context.arc(i*25, i*25, i*10, 0, Math.PI * 2, true);
  24:         context.closePath();
  25:         context.fill();
  26:     }

createLinearGradient(x1,y1,x2,y2):参数分别表示渐变起始位置和结束位置的横纵坐标

addColorStop(offset,color):offset表示设定的颜色离渐变起始位置的偏移量,取值范围是0~1的浮点值。渐变起始偏移量是0,渐变结束偏移量是1.color是渐变的颜色。

效果:

2、绘制径向渐变

   1: // 获取canvas 的ID
   2:     var canvas = document.getElementById('canvas');
   3:     if (canvas == null)
   4:     {
   5:         return false;
   6:     }
   7:     // 获取上下文
   8:     var context = canvas.getContext('2d');
   9:     // 获取渐变对象
  10:     var g1 = context.createRadialGradient(400,0,0,400,0,400);
  11:     // 添加渐变颜色
  12:     g1.addColorStop(0.1,'rgb(255,255,0)');
  13:     g1.addColorStop(0.3,'rgb(255,0,255)');
  14:     g1.addColorStop(1,'rgb(0,255,255)');
  15:     context.fillStyle = g1;
  16:     context.fillRect(0,0,400,300);
  17:     var g2 = context.createRadialGradient(250,250,0,250,250,300);
  18:     g2.addColorStop(1,'rgba(0,0,255,0.5)');
  19:     g2.addColorStop(0.7,'rgba(255,255,0,0.5)')
  20:     g2.addColorStop(0.1,'rgba(255,0,0,0.5)');
  21:     for(var i = 0; i<10;i++)
  22:     {
  23:         context.beginPath();
  24:         context.fillStyle=g2;
  25:         context.arc(i*25, i*25, i*10, 0, Math.PI * 2, true);
  26:         context.closePath();
  27:         context.fill();
  28:     }

createRadialGradient(x1,y1,radius1,x2,y2,radius2):x1,y1,radius1分别是渐变开始圆的圆心横纵坐标和半径。x2,y2,radius2分别是渐变结束圆的圆心横纵坐标和半径。

效果

二、图形变换

1、坐标变换:平移、缩放和旋转

   1: // 获取canvas 的ID
   2:     var canvas = document.getElementById('canvas');
   3:     if (canvas == null)
   4:     {
   5:         return false;
   6:     }
   7:     // 获取上下文
   8:     var context = canvas.getContext('2d');
   9:     context.fillStyle = '#eeeeff';
  10:     context.fillRect(0,0,400,300);
  11:     // 平移坐标原点
  12:     context.translate(200,50);
  13:     context.fillStyle = 'rgba(255,0,0,0.25)';
  14:     for(var i = 0; i<50;i++)
  15:     {
  16:         context.translate(25,25);
  17:         // 图形缩放
  18:         context.scale(0.95,0.95);
  19:         // 图形旋转
  20:         context.rotate(Math.PI / 10);
  21:         context.fillRect(0,0,100,50);
  22:     }

translate(x,y):平移原点,x,y表示向左和向下移动多少单位,默认单位是像素

scale(x,y):缩放,x,y表示水平和垂直方向的缩放大小。小于1缩小,大于1放大。

rotate(angle):旋转,angle是旋转角度,单位是弧度。大于0表示顺时针旋转,反之逆时针。

效果:

2、矩阵变换

   1: // 获取canvas 的ID
   2:     var canvas = document.getElementById('canvas');
   3:     if (canvas == null)
   4:     {
   5:         return false;
   6:     }
   7:     // 获取上下文
   8:     var context = canvas.getContext('2d');
   9:     // 定义颜色
  10:     var colors = ['red','orange','yellow','green','blue','navy','purple'];
  11:     // 定义线宽
  12:     context.lineWidth = 10;
  13:     // 矩阵变换
  14:     context.transform(1,0,0,1,100,0);
  15:     // 循环绘制圆弧
  16:     for (var i = 0; i < colors.length; i++)

17: { //原点每次下移10个px

  18:          context.transform(1,0,0,1,0,10);
  19:         context.strokeStyle = colors[i];
  20:         context.beginPath();
  21:         context.arc(50,100,100,0,Math.PI,true);
  22:         context.stroke();
  23:     }

transform(m11,m12,m21,m22,dx,dy):改方法使用一个新的变换矩阵与当前变换矩阵进行乘法运算。dx,dy表示原点坐标左移和下移的单位,默认是像素。

该变换矩阵格式如下

m11     m12   dx

m21      m22  dy

0            0         1

最终效果:

总结:坐标变换的方法均可以用transform()代替,规则如下:

1、translate(x,y)  <=>  transform(1,0,0,1,dx,dy)或transform(0,1,1,0,dx,dy),前四个参数表示不对图形进行缩放操作。

2、scale(x,y) <=> transform(x,0,0,y,0,0)或transform(0,y,x,0,0,0),后面两个参数表示不进行平移。

3、 rotate(angle) <=> transform(Math.cos(angle*Math.PI/180),Math.sin(angle*Math.PI/180),- Math.sin(angle*Math.PI/180),Math.cos(angle*Math.PI/180),0,0)或

transform(-Math.sin(angle*Math.PI/180),Math.cos(angle*Math.PI/180),Math.cos(angle*Math.PI/180),Math.sin(angle*Math.PI/180),0,0)

下一篇:Canvas入门(3):图像处理和绘制文字

Canvas入门(2):图形渐变和图像形变换的更多相关文章

  1. Canvas入门(1):绘制矩形、圆、直线、曲线等基本图形

    来源:http://www.ido321.com/968.html 一.Canvas的基础知识 Canvas是HTML 5中新增的元素,专门用于绘制图形.canvas元素就相当于一块“画布”,一块无色 ...

  2. Html5学习2(Html表格、Html列表、Html5新元素、Canvas (坐标、路径、画圆、文本、渐变、图像))

    Html表格 1.表格中的表头:<th></th>.其中表头部分字体加粗,颜色深绿色 <h4>水平标题:</h4> <table border=& ...

  3. Canvas入门(3):图像处理和绘制文字

    来源:http://www.ido321.com/997.html 一.图像处理(非特别说明,所有结果均来自最新版Google) 在HTML 5中,不仅可以使用Canvas API绘制图形,也可以用于 ...

  4. HTML5 canvas入门

    HTML5 Canvas入门 <canvas> 标签定义图形,比如图表和其他图像,您必须使用脚本来绘制图形.在画布上(Canvas)画一个红色矩形,渐变矩形,彩色矩形,和一些彩色的文字. ...

  5. Canvas入门(3):图像处理和渲染文本

    资源:http://www.ido321.com/997.html 一.图像处理(非特别说明,全部结果均来自最新版Google) 在HTML 5中,不仅能够使用Canvas API绘制图形,也能够用于 ...

  6. canvas学习笔记(中篇) -- canvas入门教程-- 颜色/透明度/渐变色/线宽/线条样式/虚线/文本/阴影/图片/像素处理

    [中篇] -- 建议学习时间4小时  课程共(上中下)三篇 此笔记是我初次接触canvas的时候的学习笔记,这次特意整理为博客供大家入门学习,几乎涵盖了canvas所有的基础知识,并且有众多练习案例, ...

  7. HTML5使用Canvas来绘制图形

    一.Canvas标签: 1.HTML5<canvas>元素用于图形的绘制,通过脚本(通常是javascript)来完成. 2.<canvas>标签只是图形容器,必须使用脚本来绘 ...

  8. canvas学习笔记(上篇)-- canvas入门教程 -- canvas标签/方块/描边/路径/圆形/曲线

    [上篇] -- 建议学习时间4小时  课程共(上中下)三篇 此笔记是我初次接触canvas的时候的学习笔记,这次特意整理为博客供大家入门学习,几乎涵盖了canvas所有的基础知识,并且有众多练习案例, ...

  9. Canvas学习:封装Canvas绘制基本图形API

    Canvas学习:封装Canvas绘制基本图形API Canvas Canvas学习   从前面的文章中我们了解到,通过Canvas中的CanvasRenderingContext2D对象中的属性和方 ...

随机推荐

  1. [z]CAP原理和BASE思想

    分布式领域CAP理论,Consistency(一致性), 数据一致更新,所有数据变动都是同步的Availability(可用性), 好的响应性能Partition tolerance(分区容错性) 可 ...

  2. jvm调优具体参数配置

    3.JVM参数 在JVM启动参数中,可以设置跟内存.垃圾回收相关的一些参数设置,默认情况不做任何设置JVM会工作的很好,但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能.通过设置 ...

  3. chrome中tcmalloc的使用

    chrome中内存分配采用了第三方库tcmalloc,这个库主要提供给应用程序内存管理方面的优化,按资料说内存存取速度会从300ns降到50ns.更具体的关于这个tcmalloc的信息大家可以查网上的 ...

  4. Android Studio 初探

    前言 上周由于写了一篇关于"Eclipse+ADT+Android SDK 搭建安卓开发环境" 的博文,其他博主们表示相当的不悦,都什么年代了还用Eclipse+ADT开发安卓应用 ...

  5. 1、探究java方法参数传递——引用传递?值传递!

    原创博文,转载请注明出处.谢谢~~ java程序运行时,其对象是怎么进行放置和安排的呢?内存是怎么分配的呢?理解好这个很有好处!java有5个地方可以存储数据: 1.寄存器.这是最快的存储区,位于处理 ...

  6. JDBC学习总结(五)

    取得数据库连接是件耗时间及资源的动作,尽量利用已打开的连接,也就是重复利用取得的Connection实例,是改善数据库连接性能的一个方式,而采用连接池是基本做法.由于取得Connection的方式根据 ...

  7. taglist

    http://blog.csdn.net/duguteng/article/details/7412652 这两天看到网上有将vim 改造成功能强大的IDE的blog,突然心血来潮,亲身经历了一下. ...

  8. PHP命名空间概念解析

    1. PHP中的命名空间是什么? 什么是命名空间?“从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮 ...

  9. 25-语言入门-25-n-1位数

    题目地址: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=96    描述已知w是一个大于10但不大于1000000的无符号整数,若w是n(n ...

  10. SQL延时操作

    --使用waitfor语句延迟或暂停程序的执行 --waitfor{delay'time'|time 'time'} delay是指间隔时间 最长到24小时 time是指定时间执行 waitfor d ...