1、概念

canvas一般就是用来绘制图像的

 
 

2、基本知识

上下文对象 
  var canvas = doucment.getElementById("canvas"); 
  var ctx = canvas.getContext("2d"); 
  ctx.fillStyle = "color";// 填充样式 
  ctx.strokeStyle = "color";//边框样式 
  ctx.fill();//填充区域 
  ctx.stroke();//绘制边框

附:颜色值: 
  #fff 
  #642 
  rgb(255, 128, 0) 
  rgba(100, 100, 100, 0.8) 
  hsl(20, 62%, 28%) 
  hsla(40, 82%, 33%, 0.6) 
  red

 

3、绘制矩形( 案例 )

上下文对象 
  //1、设置填充样式或者边框样式(ctx.fillStyle = "color";或者ctx.strokeStyle = "color";) 
  //2、绘制矩形区域(如果采用fillRect或者strokeRect绘制矩形,可以省略第3步); 
  //3、填充或者加上边框(ctx.fill();或者ctx.stroke();)

 

4、清除矩形区域

作用:就像刚交完工的房子,有很多垃圾,你需要清理,清理除一块区域,以后将作为你的卧室。 
  ctx.clearRect(x,y,w,h);

 

5、圆弧 ( 案例 ) ( 练习 )

//1、设置填充样式或者边框样式(ctx.fillStyle = "color";或者ctx.strokeStyle = "color";) 
  //2、绘制原型区域 
  ctx.arc(x,y,r,startAngle,endAngle,boolean); 
  r代表半径,startAngle,endAngle分别代表开始角度和结束角度,最后一个参数表示true(逆时针),false(顺时针) 
  //3、填充或者加上边框(ctx.fill();或者ctx.stroke();) 
  注:1、在绘制圆弧的时候,必须使用ctx.beginPath()开始和ctx.closePath()结束,当然,前提条件时你要画规则的图形 
  2、这里的开始角度和结束角度不是deg,而是Math.PI*(相应的值)。

 

6、路径

ctx.beginPath()与ctx.closePath() 
  注:如果不加的话,就会出现“灵异事件”(它将你的上一个结束点作为接下来的开始点);变得不是你想要的图形。

 

7、绘制线段 ( 案例1 )( 练习 )

ctx.moveTo(x,y);-----这里必须以moveTo开头,其实是将你的原点移动了位置 
  ctx.lineTo(x,y);---绘制接下来的点。 
  注:一般情况下、只需要一个moveTo即可。 
  注:线条属性lineCap: context.lineCap = 'butt'; context.lineCap = 'round';context.lineCap = 'square'( 案例 ) 
  注:线条属性lineJoin: context.lineJoin = 'miter'; context.lineJoin = 'bevel';context.lineJoin = 'round';( 案例 )

 
案例2 )( 作业 ) 
  公式:cxt.lineTo(Math.cos((18 + i * 72 ) / 180 * Math.PI) * R + x, -Math.sin((18 + i * 72 ) / 180 * Math.PI) * R + y); 
     cxt.lineTo(Math.cos((54 + i * 72 ) / 180 * Math.PI) * r + x, -Math.sin((54 + i * 72 ) / 180 * Math.PI) * r + y);

 

8、绘制贝塞尔曲线 ( 案例 )

context.bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y) 
  绘制二次样条曲线 context.quadraticCurveTo(qcpx,qcpy,qx,qy) 
  cp1x:第一个控制点x坐标 cp1y:第一个控制点y坐标 cp2x:第二个控制点x坐标 cp2y:第二个控制点y坐标 
  x:终点x坐标 y:终点y坐标 qcpx:二次样条曲线控制点x坐标 qcpy:二次样条曲线控制点y坐标 
  qx:二次样条曲线终点x坐标 qy:二次样条曲线终点y坐标 
  
  注:context.quadraticCurveTo(qcpx,qcpy,qx,qy)还可以换成 
   context.bezierCurveTo(x,y,cp2x,cp2y,x,y),第一组的x和y表示的是第一条曲线的终点

 

9、线性渐变 ( 案例 )

var lg= context.createLinearGradient(xStart,yStart,xEnd,yEnd) 
  lg.addColorStop(offset,color); 
  eg:(lg.addColorStop(0,"red");lg.addColorStop(0.5,"green");lg.addColorStop(1,"blue"))
  ctx.fillStyle = lg;

 

10、径向渐变(发散)( 案例 )

var rg=context.createRadialGradient(xStart,yStart,radiusStart,xEnd,yEnd,radiusEnd)
  径向渐变(发散)颜色rg.addColorStop(offset,color) 
  xStart:发散开始圆心x坐标 
  yStart:发散开始圆心y坐标 radiusStart:发散开始圆的半径 xEnd:发散结束圆心的x坐标 yEnd:发散结束圆心的y坐标 
  radiusEnd:发散结束圆的半径 offset:设定的颜色离渐变结束点的偏移量(0~1) 
  color:绘制时要使用的颜色 
  用法同上:9、线性渐变 
  案例:同心圆、三角案例、扇形案例

 

11、图形变形(平移、旋转、缩放)

ctx.translate(x,y); 
  ctx.rotate(Math.PI*(angleValue)); 
  ctx.scale(x,y); 
  注:平移2个值,缩放2个值,旋转角度是弧度

 

12、transform() 方法


  context.transform(a,b,c,d,e,f); 
  context.setTransform(1, 0, 0, 1, 100, 100); 
  /////////////////////////// 
   // a c e 
   // b d f 
   // 0 0 1 
   ////////////////////////// 
   // a,d 水平、垂直缩放 
   // b,c 水平、垂直倾斜 
   // c,f 水平、垂直位移 
   //////////////////////////

 

13、给图形绘制阴影

ctx.shadowOffsetX = "5"; 
  ctx.shadowOffsetY = "5"; 
  ctx.shadowBlur = "5"; 
  ctx.shadowColor = "red"; 
  绘制需要的图形

 

14、绘制文字

ctx.font="italic 30px 微软雅黑";//顺序不能改 
  *ctx.fillStyle = "color";或者ctx.strokeStyle = "color"; 
  ctx.textBaseline = "";设置垂直对齐方式 
  ctx.textAlign = "";设置水平对齐方式 
  ctx.fillText("文本",x,y)(实心字)或者ctx.strokeText("文本",x,y)(字的轮廓); 
  注:上面带*的那个设置,其实设置的时字体的颜色

 

15、保存和恢复状态(context)

ctx.save();//保存当前绘制的图形, 
  ctx.restore();//恢复到离他最近的那个save的状态

 

16、图像组合( 案例 )

在绘制完成第一个图形之后,加 
   context.globalCompositeOperation=type 
   再接着绘制第二个图形 
   type: 
   source-over(默认值):在原有图形上绘制新图形 
   destination-over:在原有图形下绘制新图形 
   source-in:显示原有图形和新图形的交集,新图形在上,所以颜色为新图形的颜色 
   destination-in:显示原有图形和新图形的交集,原有图形在上,所以颜色为原有图形的颜色 
   source-out:只显示新图形非交集部分 
   destination-out:只显示原有图形非交集部分,是将交集的部分转化为透明
   source-atop:显示原有图形和交集部分,新图形在上,所以交集部分的颜色为新图形的颜色 
   destination-atop:显示新图形和交集部分,新图形在下,所以交集部分的颜色为原有图形的颜色 
   lighter:原有图形和新图形都显示,交集部分做颜色叠加 
   xor:重叠飞部分不现实 
   copy:只显示新图形

 

17、结合setInterval制作动画( 案例 )

window.setInterval(function(){ 
  //执行的方法体 
  },10);

 

18、绘图 context.drawImage( 案例 )

context.drawImage(image,x,y) 
  image:Image对象var img=new Image(); img.src="url(...)"; 
  x:绘制图像的x坐标 y:绘制图像的y坐标 
  context.drawImage(image,x,y,w,h) 
  image:Image对象var img=new Image(); img.src="url(...)"; 
  x:绘制图像的x坐标 y:绘制图像的y坐标 w:绘制图像的宽度 h:绘制图像的高度 
  context.drawImage(image,sx,sy,sw,sh,dx,dy,dw,dh):选取图像的一部分矩形区域进行绘制 
  image:Image对象var img=new Image(); img.src="url(...)"; 
  sx:图像上的x坐标 sy:图像上的y坐标 sw:矩形区域的宽度 sh:矩形区域的高度 
  dx:画在canvas的x坐标 dy:画在canvas的y坐标 dw:画出来的宽度 dh:画出来的高度

canvas的使用的更多相关文章

  1. html5 canvas常用api总结(三)--图像变换API

    canvas的图像变换api,可以帮助我们更加方便的绘画出一些酷炫的效果,也可以用来制作动画.接下来将总结一下canvas的变换方法,文末有一个例子来更加深刻的了解和利用这几个api. 1.画布旋转a ...

  2. 【探索】利用 canvas 实现数据压缩

    前言 HTTP 支持 GZip 压缩,可节省不少传输资源.但遗憾的是,只有下载才有,上传并不支持.如果上传也能压缩,那就完美了.特别适合大量文本提交的场合,比如博客园,就是很好的例子. 虽然标准不支持 ...

  3. 简单入门canvas - 通过刮奖效果来学习

    一 .前言 一直在做PC端的前端开发,从互联网到行业软件.最近发现移动端已经成为前端必备技能了,真是不能停止学习.HTML5新增的一些东西,canvas是用的比较多也比较复杂的一个,简单的入门了一下, ...

  4. 获取Canvas当前坐标系矩阵

    前言 在我的另一篇博文 Canvas坐标系转换 中,我们知道了所有的平移缩放旋转操作都会影响到画布坐标系.那在我们对画布进行了一系列操作之后,怎么再知道当前矩阵数据状态呢. 具体代码 首先请看下面的一 ...

  5. Canvas坐标系转换

    默认坐标系与当前坐标系 canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸.左上角坐标为x=0,y=0的点称作原点.在默认坐标系中,每一个点的坐标都是直接 ...

  6. Canvas绘图之平移translate、旋转rotate、缩放scale

    画布操作介绍 画布绘图的环境通过translate(),scale(),rotate(), setTransform()和transform()来改变,它们会对画布的变换矩阵产生影响. 函数 方法 描 ...

  7. 用html5的canvas和JavaScript创建一个绘图程序

    本文将引导你使用canvas和JavaScript创建一个简单的绘图程序. 创建canvas元素 首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面. <canvas ...

  8. html5标签canvas函数drawImage使用方法

    html5中标签canvas,函数drawImage(): 使用drawImage()方法绘制图像.绘图环境提供了该方法的三个不同版本.参数传递三种形式: drawImage(image,x,y):在 ...

  9. 使用 JavaScript 和 canvas 做精确的像素碰撞检测

    原文地址:Pixel accurate collision detection with Javascript and Canvas 译者:nzbin 我正在开发一个需要再次使用碰撞检测的游戏.我通常 ...

  10. H5项目开发分享——用Canvas合成文字

    以前曾用Canvas合成.裁剪.图片等<用H5中的Canvas等技术制作海报>.这次用Canvas来画文字. 下图中"老王考到驾照后"这几个字是画在Canvas上的,与 ...

随机推荐

  1. 用Spark学习FP Tree算法和PrefixSpan算法

    在FP Tree算法原理总结和PrefixSpan算法原理总结中,我们对FP Tree和PrefixSpan这两种关联算法的原理做了总结,这里就从实践的角度介绍如何使用这两个算法.由于scikit-l ...

  2. Oracle RAC学习笔记01-集群理论

    Oracle RAC学习笔记01-集群理论 1.集群相关理论概述 2.Oracle Clusterware 3.Oracle RAC 原理 写在前面: 最近一直在看张晓明的大话Oracle RAC,真 ...

  3. 在Oracle中数据库、表空间、表之间的关系

    在oracle中,表空间是存储概念上的,建立表空间需要有对应的数据文件,数据文件建立好之后直接会把一定的磁盘空间分配给它,这样可以对数据库的存储空间进行有效的管理.然后在建表的时候指定对应的表空间,该 ...

  4. BZOJ-2150部落战争(最小路径覆盖)

    2150: 部落战争 Time Limit: 10 Sec  Memory Limit: 259 MB Description lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国 ...

  5. 开发mis系统的技术

    一.b/s架构 b/s架构:就broser/server,浏览器/服务器的说法.服务器端要运行tomcat,提供链接数据库服务供java代码读写数据,这个可以在eclipse中配置运行.浏览器则解释j ...

  6. Java模拟新浪微博登陆抓取数据

    前言:  兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先:  要想登陆新浪微博需要 ...

  7. Giraph入门

    概要 这是一个Giraph的入门教程,主要用来运行少量输入的Giraph程序,并不能用于生产环境. 在这个教程中,我们将会在一个物理机器行部署一个单节点,伪分布的Hadoop集群.这个节点既是mast ...

  8. Python求解进制问题(阿里巴巴2015笔试题)

    问题描述:用十进制计算30的阶乘,然后把结果转换成三进制表示,那么该进制表示的结果末尾会有多少个连续0?解析:作为笔试题的话,要想按照题意先把阶乘结果计算出来再转换成三进制最后再数0的个数,时间肯定来 ...

  9. CLAHE的实现和研究

    CLAHE算法对于医学图像,特别是医学红外图像的增强效果非常明显. CLAHE  https://en.wikipedia.org/wiki/Adaptive_histogram_equalizati ...

  10. loadrunner11.0之IP欺骗

    一:设置虚拟ip地址 操作步骤: 1:添加ip地址 运行loadrunner---tools---IP wizard 2:选择create  new setting,点击"下一步" ...