来源: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. 【mongoDB高级篇②】大数据聚集运算之mapReduce(映射化简)

    简述 mapReduce从字面上来理解就是两个过程:map映射以及reduce化简.是一种比较先进的大数据处理方法,其难度不高,从性能上来说属于比较暴力的(通过N台服务器同时来计算),但相较于grou ...

  2. 编译器的未来——我们还需要C++么?

    在未来我们还需要纯C++开发模式么? 随着C++11的诞生,C++已经越来越臃肿,从03的时候就觉得C++实在是太复杂了.以一个合格C++程序员的标准来简单的来说3-5年略有小成,5-8年才可以说自己 ...

  3. WCF入门(五)---创建WCF服务

    使用Microsoft Visual Studio2012创建WCF服务,理解如下所有必要的编码,更好地创建WCF服务的概念,这里做一个简单的任务. 启动Visual Studio 2012. 单击新 ...

  4. C# Java间进行RSA加密解密交互(三)

    原文:C# Java间进行RSA加密解密交互(三) 接着前面一篇C# Java间进行RSA加密解密交互(二)说吧,在上篇中为了实现 /** * RSA加密 * @param text--待加密的明文 ...

  5. Hibernate配置文件hbm主键的generator可选项

    Hibernate配置文件hbm主键的generator可选项 1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.i ...

  6. 实例学习写Makefile文件

    目录 0. 扫盲 1. 编译,链接 2. Makefile文件执行 3. Makefile书写规则 4. 案例 5. Makefile是如何工作的 6. 拔高,参考 0. 扫盲 Linux 环境下的程 ...

  7. 素数筛法--SPOJ Problem 2 Prime Generator

    质数(prime number)又称素数,除了1和它本身外,不能整除以其他自然数,换句话说就是该数除了1和它本身以外不再有其他的因数:否则称为合数.最小的质数是2. 要判断一个整数N是不是质数很简单, ...

  8. Ubuntu下jdk配置

    在Oracle官网下载linux版本的以tar.gz结尾的jdk建立文件夹用来存放解压后的jdksudo mkdir /usr/java进入jdk下载文件夹,解压并存放jdksudo tar zxvf ...

  9. Git for windows 中文乱码解决方案

    1.git status时显示乱码,如下: \316\304\261\276\316\304\265\265.txt 解决方案: $ git config --global core.quotepat ...

  10. trackr: An AngularJS app with a Java 8 backend – Part I

    该系列文章来自techdev 我想分享在techdev公司开发的项目-trackr-的一些最新的见解.trackr是一个用来跟踪我们的工作时间,创建报告和管理请假的web应用程序.做这个程序的目的有两 ...