H5 认识canvas

  不同于SVG,HTML中的元素canvas只支持一种原生的图形绘制:矩形。所有其他的图形的绘制都至少需要生成一条路径。不过,我们拥有众多路径生成的方法让复杂图形的绘制成为了可能。

canvas提供了三种方法绘制矩形

fillRect(x, y, width, height)  绘制一个填充的矩形;

strokeRect(x, y, width, height)  绘制一个矩形的边框;

clearRect(x, y, width, height)   清除指定矩形区域,让清除部分完全透明。

x与y指定了在canvas画布上所绘制的矩形的左上角(相对于原点)的坐标。width和height设置矩形的尺寸。

例如画个矩形:

<canvas id="canvas" width="400" height="400">你的浏览器不支持canvas</canvas>
<script type="text/javascript">
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");
    //绘制矩形
    ctx.fillRect(100,100,200,200);
    ctx.clearRect(150,150,100,100);
    ctx.strokeRect(160,160,80,80);
</script>

fillRect()函数绘制了一个边长为200px的黑色正方形。clearRect()函数从正方形的中心开始擦除了一个100*100px的正方形,接着strokeRect()在清除区域内生成一个80*80的正方形边框。效果图:

绘制路径

使用路径绘制图形需要一些额外的步骤。首先,需要生成路径。然后再路径上使用绘图命令绘制。之后闭合路径。一旦路径生成,你就能通过描边或填充路径来渲染图形。以下是所要用到的函数:

beginPath()
新建一条路径,生成之后,图形绘制命令被指向到路径上生成路径。
closePath()
闭合路径之后图形绘制命令有重新指向到上下文中。
stroke()
通过线条来绘制图形轮廓。
fill()
通过填充路径的内容区域生成图形。
生成路径的第一步叫做beginPath()。本质上,路径是由很多子路径构成,这些子路径都是在一个列表中,所有的子路径(线、矩形、等等)构成图形。而每次这个方法调用之后,列表清空重置,然后我们就可以重新绘制新的图形。

注意:当前路径为空,即调用beginPath()之后,或者canvas刚建的时候,第一条路径构造命令通常被视为是moveTo(),无论最后的是什么。出于这个原因,你几乎总是要在设置路径之后专门指定你的起始位置。
第二步就是调用函数指定绘制路径,等下回简单介绍。

第三,就是闭合路径closePath(),不是必需的。这个方法会通过绘制一条从当前点到开始点的直线来闭合图形。如果图形是已经闭合了的,即当前点为开始点,该函数什么也不做。

注意:当你调用fill()函数时,所有没有闭合的形状都会自动闭合,所以你不需要调用closePath()函数。而这并不是stroke()所具有的。

例如,绘制三角形的代码如下:

<canvas id="canvas" width="400" height="400">你的浏览器不支持canvas</canvas>
<script type="text/javascript">
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");

    ctx.beginPath();//开始一个路径
    ctx.moveTo(100,100);
    ctx.lineTo(300,100);
    ctx.lineTo(300,300);
    ctx.closePath();//闭合路径
    ctx.fill();
</script>

圆形的绘制

arc(x,y,r,sa,ea,true/false):x、y为圆心坐标,r为半径,sa、ea分 别为起始角度和结束角度,最后一个参数为true时,顺时针画圆,false 则逆时针画圆

<canvas id="canvas" width="400" height="400">你的浏览器不支持canvas</canvas>
<script type="text/javascript">
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");
    ctx.beginPath();
    ctx.arc(200,200,100,0,Math.PI*2,false);
    ctx.stroke();
</script>    

贝塞尔曲线:

quadraticCurveTo (kx,ky,ex,ey) :二次贝塞尔曲线,一个控制点,一个终点。

bezierCurveTo (kx1,ky1,kx2,ky2,ex,ey) :三次贝塞尔曲线,两个控制点,一个终点。

什么是控制点,如图:

二次贝塞尔曲线

这个例子使用多个贝塞尔曲线来渲染对话框。

<canvas id="canvas" width="400" height="400">你的浏览器不支持canvas</canvas>
<script type="text/javascript">
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");
        ctx.beginPath();
        ctx.moveTo(75,25);
        ctx.quadraticCurveTo(25,25,25,62.5);
        ctx.quadraticCurveTo(25,100,50,100);
        ctx.quadraticCurveTo(50,120,30,125);
        ctx.quadraticCurveTo(60,120,65,100);
        ctx.quadraticCurveTo(125,100,125,62.5);
        ctx.quadraticCurveTo(125,25,75,25);
        ctx.stroke();
</script>            

效果图:

三次贝塞尔曲线

这个例子使用贝塞尔曲线绘制心形。

<canvas id="canvas" width="400" height="400">你的浏览器不支持canvas</canvas>
<script type="text/javascript">
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");
        ctx.beginPath();
    ctx.moveTo(75,40);
    ctx.bezierCurveTo(75,37,70,25,50,25);
    ctx.bezierCurveTo(20,25,20,62.5,20,62.5);
    ctx.bezierCurveTo(20,80,40,102,75,120);
    ctx.bezierCurveTo(110,102,130,80,130,62.5);
    ctx.bezierCurveTo(130,62.5,130,25,100,25);
    ctx.bezierCurveTo(85,25,75,37,75,40);
    ctx.fill();
</script>    

效果图:

基本图形绘制就这样了,我不会很详细地讲解上面的代码,因为事实上这很容易理解。

时间: 2024-10-10 22:04:12

H5 认识canvas的相关文章

关于h5绘制canvas生成图片的注意点!

1.第一个是关于移动端自适应的问题: 答:如果是最后只要一张canvas生成的图片,而不是要绘制的canvas的图形,则不需要考虑自适应,绘制canvas的时候的宽高,可以直接写成UI提供的图的大小,比如UI提供的图是 750 * 1280 ,则绘制canvas的时候,所有的数据都可以 以375*640来进行计算,固定好即可!这个跟后台绘制图片的原理一样,我们不需要考虑自适应,ui给什么图,或者说我们希望要多大的图片,我们直接绘制即可,因为图片最后自己可以按比例伸缩,默认即是自适应! 2.关于H

h5标签canvas关于getImageData跨域的问题

在学习h5的时候,canvas标签中getImageData()报错:security error! 具体代码如下(chrome浏览器): function createGSCanvas(img){ var canvas=document.createElement("canvas"); canvas.width=img.width; canvas.height=img.height; var ctx=canvas.getContext("2d"); ctx.dra

用H5的canvas做时钟

<!doctype html><html> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <canvas id="can1" width="500px" height="500px"></canvas> <scr

H5之canvas简单入门

<canvas></canvas>是html5出现的新标签,像所有的dom对象一样它有自己本身的属性.方法和事件,其中就有绘图的方法,js能够调用它来进行绘图 <canvas id="myCanvas" width="400" height="400"></canvas>默认宽度300px,默认高度 150px; 下面是简单的语法,是必须要记住的. 绘图路径: beginPath() :开始路径 c

H5之canvas

Canvas是HTML5新增的组件,它就像一块幕布,可以用JavaScript在上面绘制各种图表.动画等. 在使用Canvas前,用canvas.getContext来测试浏览器是否支持Canvas: <!-- HTML代码 --><canvas id="test-canvas" width="200" heigth="100"><p>你的浏览器不支持Canvas</p></canvas>

一个在h5的canvas元素中画扑克牌jquery插件实现

1 //非架构 2 ; (function ($) { 3 var aspect = 5.7 / 8.8;//扑克宽和高比例 4 function PaintBoder(canv, x, y, h,poker) { 5 var boder = new Boder(canv, h); 6 boder.X = x; 7 boder.Y = y; 8 var c = canv.getContext("2d"); 9 c.save() 10 c.lineWidth = 1; 11 boder.

H5利用canvas实现海报功能

最近接到一个需求,微信中用户上传图片生成海报.这个需求比较常规,实现思路也比较简单,通过利用用户的input输入,对所上传的图片进行处理,最后通过第三方库html2canvas合成对应的图片即可.思路虽然简单,但是在实现的过程中会遇到各种各样的小问题,现在就将遇到的问题进行一次总结. 1.iphone以及部分android机型通过摄像头拍摄的照片被旋转了90度 原因:由于目前的手机拍照基本都在2M以上,而ios中只要超过2M图片就会自动旋转.拍照后直接取出来的UIimage(用UIImagePi

h5的canvas绘制方格

两个循环绘制 <body> <canvas id="cv" width="800" height="500"></canvas> <script> var cv = document.querySelector('#cv'); var ctx = cv.getContext('2d'); ctx.beginPath(); // 绘制水平线,起始点x坐标都为0,结束点x坐标都为宽度 // y坐标从50

H5在canvas中绘制图片时候遇到跨域问题

在前端绘制图片时需要用到其他服务器的图片,当然没有读取成功. 在网上一顿搜索,设置了图片允许跨域. img.crossOrigin = "Anonymous" 在调试中也可以看到图片,不过还是绘制失败.经过一波XXX式的试探和查找,找到一个解决方案. 在在iis中配置响应头,可能是之前获取图片的时候没有能够通过允许的类型. Access-Control-Allow-Credentials:true Access-Control-Allow-Headers:origin,x-reques