canvas画图——初级篇

         canvas画图之初级篇

小女子准备将canvas画图分为初级篇,中级篇和高级篇来介绍,读者们不要着急哦。

初级篇

一.首先什么是canvas呢?

canvas 是 HTML5 提供的一个用于展示绘图效果的标签. canvas 原意画布, 帆

布. 在 HTML 页面中用于展示绘图效果. 最早 canvas 是苹果提出的一个方案, 今天已经在大多数浏览器中实现。

canvas 英 [‘kænv?s]  美 [‘kænv?s]   帆布 画布

二.让我们先来了解下canvas的基本用法:

<canvas></canvas>

(1)使用 canvas 标签(该标签用于展示图像)即可在页面中开辟一块区域. 可以通过设置其 width 和 height 来设置该区域的尺寸.

(2)默认情况下 canvas 的宽为300,高为150.

(3)不要使用 CSS 的方式设置宽高(会有拉伸的问题), 应该使用 HTML 属性.

(4)如果浏览器不支持 canvas 标签, 那么就会将其解释为 div 标签. 因此常常在 canvas 中嵌入文本, 以提示用户浏览器的能力.

(5)canvas 的兼容性非常强, 只要支持该标签的, 基本功能都一样, 因此不用考虑兼容性问题.

(6)canvas 本身不能绘图. 是使用 JavaScript 来完成绘图. canvas 对象提供了各种绘图用的 api.

三.接下来该介绍下canvas的基本绘图方法了。

1.基本绘图步骤:

(1).获得 canvas 对象.

(2).调用 getContext 方法, 提供字符串参数 ‘2d‘.

(3).该方法返回 CanvasRenderingContext2D 类型的对象. 该对象提供基本的绘图命令.

(4).使用 CanvasRenderingContext2D 对象提供的方法进行绘图.

(5).基本绘图命令:

a.设置开始绘图的位置: context.moveTo( x, y ).

b.设置直线到的位置: context.lineTo( x, y ).

c.描边绘制: context.stroke().

d.填充绘制: context.fill().

e.闭合路径: context.closePath().

2.绘制基本线

var canvas = document.createElement( ‘canvas‘ );

canvas.width = 500;

canvas.height = 400;

canvas.style.border = ‘1px dashed red‘;

document.body.appendChild( canvas );

// 获得 CanvasRenderingContext2D 对象

var context = canvas.getContext( ‘2d‘ );

// 设置 起点

context.moveTo( 0, 0 );

// 绘制直线

context.lineTo( 500, 400 );

// 设置 起点

context.moveTo( 0, 400 );

// 绘制直线

context.lineTo( 500, 0 );

// 描边显示效果

context.stroke();

运行结果为:

3.计算机直角坐标系

需要注意的是,计算机直角坐标系与我们数学学习中的直角坐标系是有点区别的,垂直方向上,向下是正方向,向上为负方向,这点要与数学中的坐标系区别开来。如下图所示:

代码分析:

(1).需要绘图就需要有 canvas 标签, 该标签用于展示图像.

(2).canvas 的宽高不要使用 CSS 来设置, 会有拉伸的问题. 应该直接使用属性设置.

(3).但是 canvas 只是展示图像的标签, 它没有绘图的能力. 需要使用 canvas 的上下文工具来实现绘图.

(4).使用 canvas.getContext( ‘2d‘ ) 可以获得绘图工具, 该工具是 CanvasRenderingContext2D 类型的对象.

(5).需要绘图, 首选设置绘图的起点.

a.使用 canvas 绘图, 最主要的是他主张先描点, 再连线绘制效果.

b.因此需要首先设置起点, 然后在起点的基础上描述其他需要的点.

c.使用 CanvasRenderingContext2D.moveTo( x, y ) 方法设置起点.

d.其中 x, y 表示的是在坐标系中的位置.

(6).使用 CanvasRenderingContext2D.lineTo( x, y ) 来描述绘制直线的下一个点. 依次类推可以描述多个点.

(7).描点结束后, 需要使用 CanvasRenderingContext2D.stroke() 方法来连线. 才可以显示出效果.

4.基本方法:

(1)getContext 方法

语法: Canvas.getContext( typeStr )

描述:

该方法用于绘制上下文工具.

如果是绘制平面图形使用 ‘2d‘ 作为参数, 如果绘制立体图形使用 ‘webgl‘.

使用 ‘2d‘ 返回 CanvasRenderingContext2D 类型的对象.

使用 ‘webgl‘ 返回 WebGLRenderingContext 类型的对象.

(2) moveTo 方法

语法: CanvasRenderingContext2D.moveTo( x, y )

描述:

该方法用于设置绘制起点.

其中参数 x, y 表示在坐标系中的位置, 分别是 x 坐标与 y 坐标.

(3) lineTo 方法

语法: CanvasRenderingContext2D.lineTo( x, y )

描述:

该方法用于设置需要绘制直线的另一个点. 最终描边后会连线当前点和方法参数描述的点.

其中参数 x, y 表示在坐标系中的位置, 分别是 x 坐标与 y 坐标.

(4)stroke 方法

语法: CanvasRenderingContext2D.stroke()

描述: 该方法用于连线, 将描述的所有点按照指定顺序连接起来.

(5) 结论

a绘图先要获得上下文, 即绘图工具

b绘图需要设置开始的坐标

c绘图是先描点, 然后一个一个依次连线

d依次绘图只能绘制单一样式( 色彩等 )

5.非零环绕原则

所谓的非零环绕原则是指:内外图形的绘制其实方向正好相反(一个绘制方向为顺时针,一个绘制方向为逆时针),在使用fill()方法时,被填充的就只是内部图形以外,外部图形以内部分。

如下图示例:

分析:

假如我们用+1代表顺时针(正方向),用-1来代表逆时针(负方向),则-1+(+1)+(-1)=-1,不等于零,故满足非零环绕原则,使用fill()方法时,被填充的是小正方形与大正方形中间的部分。

6.闭合路径closePath

语法: CanvasRenderingContext2D.closePath()

描述: 使用该方法可以将最后一个描点与最开始的描点自动连接起来.

代码

...

ctx.moveTo( 100, 100 );

ctx.lineTo( 300, 100 );

ctx.lineTo( 300, 200 );

ctx.closePath();

ctx.stroke();

 

结果为:

7.线型的相关属性

设置描边与填充不一定只能使用黑色的细线. 可以利用一些属性设置其效果

CanvasRenderingContext2D.lineWidth 设置线宽.

CanvasRenderingContext2D.lineCap 设置线末端类型.

CanvasRenderingContext2D.lineJoin 设置相交线的拐点.

CanvasRenderingContext2D.getLineDash() 获得线段样式数组.

CanvasRenderingContext2D.setLineDash() 设置线段样式.

CanvasRenderingContext2D.lineDashOffset 绘制线段偏移量.

7.1.设置线宽

语法: CanvasRenderingContext2D.lineWidth = number

描述: 设置线宽.

代码:

...

ctx.moveTo( 100, 100 );

ctx.lineTo( 300, 100 );

ctx.stroke();

ctx.beginPath();

ctx.lineWidth = 10;

ctx.moveTo( 100, 250 );

ctx.lineTo( 300, 250 );

ctx.stroke();

效果:

7.2设置线末端类型

语法: CanvasRenderingContext2D.lineCap = value

描述:

设置线型末端的样式, 可取值为: ‘butt‘( 默认 ), ‘round‘, ‘square‘.

‘butt‘ 表示两端使用方形结束.

‘round‘ 表示两端使用圆角结束.

‘square‘ 表示突出的圆角结束.

代码

...

ctx.lineWidth = 10;

ctx.moveTo( 100, 100 );

ctx.lineTo( 300, 100 );

ctx.stroke();

ctx.beginPath();

ctx.lineCap =  ‘round‘;

ctx.moveTo( 100, 130 );

ctx.lineTo( 300, 130 );

ctx.stroke();

ctx.beginPath();

ctx.lineCap =  ‘square‘;

ctx.moveTo( 100, 160 );

ctx.lineTo( 300, 160 );

ctx.stroke();

效果:

7.3设置相交线的拐点

语法: CanvasRenderingContext2D.lineJoin = value

描述:

设置两条直线的拐点描述方式. 可以取值 ‘round‘, ‘bevel‘, ‘miter‘(默认)

‘round‘ 使用圆角连接.

‘bevel‘ 使用平切连接.

‘miter‘ 使用直角转.

代码    ...

ctx.lineWidth = 10;

ctx.lineJoin = ‘round‘;

ctx.moveTo( 100, 100 );

ctx.lineTo( 200, 200 );

ctx.lineTo( 300, 100 );

ctx.stroke();

ctx.beginPath();

ctx.lineJoin = ‘bevel‘;

ctx.moveTo( 100, 150 );

ctx.lineTo( 200, 250 );

ctx.lineTo( 300, 150 );

ctx.stroke();

ctx.beginPath();

ctx.lineJoin = ‘miter‘;

ctx.moveTo( 100, 200 );

ctx.lineTo( 200, 300 );

ctx.lineTo( 300, 200 );

ctx.stroke();

效果为:

7.4虚线

语法:

CanvasRenderingContext2D.lineDashOffset = number

CanvasRenderingContext2D.getLineDash()

CanvasRenderingContext2D.setLineDash()

描述:

setLineDash 用于设置开始绘制虚线的偏移量. 数字的正负表示左右偏移.

getLineDash() 与 setLineDash() 方法使用数组描述实线与虚线的长度.

代码

...

ctx.moveTo( 100, 90 );

ctx.lineTo( 100, 110 );

ctx.moveTo( 300, 90 );

ctx.lineTo( 300, 110 );

ctx.moveTo( 100, 140 );

ctx.lineTo( 100, 160 );

ctx.moveTo( 300, 140 );

ctx.lineTo( 300, 160 );

ctx.moveTo( 100, 190 );

ctx.lineTo( 100, 210 );

ctx.moveTo( 300, 190 );

ctx.lineTo( 300, 210 );

ctx.stroke();

ctx.beginPath();

ctx.moveTo( 100, 100 );

ctx.lineTo( 300, 100 );

ctx.stroke();

ctx.beginPath();

ctx.setLineDash( [ 5, 5 ] );

ctx.moveTo( 100, 150 );

ctx.lineTo( 300, 150 );

ctx.stroke();

ctx.beginPath();

ctx.lineDashOffset = -2;

ctx.moveTo( 100, 200 );

ctx.lineTo( 300, 200 );

ctx.stroke();

效果为:

7.5填充与描边样式

语法:

CanvasRenderingContext2D.strokeStyle = value

CanvasRenderingContext2D.fillStyle = value

描述:

strokeStyle 可以设置描边颜色, 与 CSS 的语法一样

fillStyle 设置填充颜色, 与 CSS 语法一样

这两个属性还可以设置渐变对象.

代码

for (var i=0;i<6;i++){

for (var j=0;j<6;j++){

ctx.strokeStyle = ‘rgb(0,‘ + Math.floor(255-42.5*i) + ‘,‘ +

Math.floor(255-42.5*j) + ‘)‘;

ctx.beginPath();

ctx.arc(12.5+j*25,12.5+i*25,10,0,Math.PI*2,true);

ctx.stroke();

}

}

效果为:

时间: 2025-01-04 10:21:30

canvas画图——初级篇的相关文章

Canvas画图之中级篇

前段时间介绍了canvas画图的初级篇,今天接着介绍中级篇了... 一.绘制形状 绘制图形不仅仅是利用线条来实现绘图, 还可以有快捷的绘制图形的办法 1.绘制矩形 2.绘制圆弧 1 绘制矩形 绘制矩形的方法 CanvasRenderingContext2D.strokeRect CanvasRenderingContext2D.fillRect CanvasRenderingContext2D.rect 注意: rect 方法就是矩形路径, 还需要使用 fill 或 stroke 才可以看到效果

HTML5 Canvas(画布)实战编程初级篇:基本介绍和基础画布元素

欢迎大家阅读HTML5 Canvas(画布)实战编程初级篇系列,在这个系列中,我们将介绍最简单的HTML5画布编程.包括: 画布元素 绘制直线 绘制曲线 绘制路径 绘制图形 绘制颜色,渐变和图案 绘制图片 绘制文本 相关要求 环境要求:Google Chrome, Firefox, Safari, Opera, 或者 IE9以上的现代浏览器 编程要求:需要有基础的HTML和Javascript编程经验,相关的画布编程将调用Javascript API来处理 HTML Canvas基本元素 HTM

html5 Canvas画图3:1px线条模糊问题

点击查看原文地址: html5 Canvas画图3:1px线条模糊问题 本文属于<html5 Canvas画图系列教程> 接上一篇canvas画线条教程 上次我们讲到,canvas有时候会出现1像素的线条模糊不清且好像更宽的情况,如下图: 这样的线条显然不是我们想要的. 这篇文章的目的就是弄清楚里面的原理,以及解决它. 大家都知道屏幕上最小的显示尺寸就是1像素,虽然小于1像素的东西可能显示不出来,但计算机可不管,他会试着画一下. 其实像素终究来说也是一个单位,假如我们把画布放大到足够大,足以看

[转]html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法

arc与arcTo,从名字都能看出来相似.arcTo也是画曲线的方法,而且他画出的曲线也是正圆的一段弧线.但他的参数和arc简直是不共戴天~ ctx.arcTo(x1,y1,x2,y2,radius);arcTo的参数中包括两个点,而且这两个点中并没有表示圆心的点,仅仅最后的参数是圆的半径,表示arcTo和圆有那么点关系. 网上关于arcTo的文章很少,好不容易找到一篇还是外国的:而且canvas画图木有直观工具,只能靠猜,arcTo害我猜了半天.. 为了直观的描述,我采取了一种辅助办法:arc

Canvas画图在360浏览器中跑偏的问题

问题描述,canvas画图的js代码中编写的是画正方形的代码,结果在360浏览器上变成了长方形,不知道怎么回事,请问各位大神是否遇到过此类问题? 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 5 <title></title> 6

canvas 画图工具 -- CanvasDraw

最近有些项目中用到了canvas画图: 为了方便封装了一下: 他的强大之处是 处理了各种偏针的问题: 1,css 强制宽高的变形 造成的偏针 2,给canvas加边 造成的偏针 3,上层父级缩放 造成的偏针 ( 前两种函数自行校正,第3种要传参) 更多去 github 吧,记得点赞谢谢 CanvasDraw:https://github.com/songyijian/CanvasDraw var c2=new CanvasDraw('#canvas2',{ 'attr':{'width':400

内存泄露之常见问题解决--初级篇

身为一个段子猿,我决定来写写最近的学习心得. 1.简介 在整个Android开发过程中,内存泄露是导致OOM的一个重点因素.大概意思就是:GC无法回收原本应该被回收的对象,这个对象就引发了内存泄露.那有什么危害呢?手机的内存大小是有限的,如果不能释放的话,你就无法创建新的对象,你的新界面等等就无法正常运行,然后程序就OOM了(OutOfMemory). 2.OOM以及内存泄露 OOM通俗点讲就是,你家里有2个厕所,本来你和你老婆用的话,都是够用的,有一天你不小心造人了,从此家里有了1+1=3个人

javascript调试之chrome初级篇

请原谅我的喜新厌旧! 以前我是firebug和firefox的忠实粉丝,虽然现在依然对ff心存好感,但是chrome在我心中的地位与日俱增.以前实习时导师看到我在用firebug调试时善意地告诉我以后要习惯用chrome,我还不以为意,直到现在深深地爱上了chrome的简洁方便.我基本不会html和css,js也只会那么一点,所以现在为止基本上不用用到高级一点的调试,so此文为调试之初级篇.

python_way ,day7 面向对象 (初级篇)

面向对象 初级篇 python支持 函数 与 面向对象 什么时候实用面向对象? 面向对象与函数对比 类和对象 创建类 class 类名 def 方法名(self,xxxx) 类里面的方法,只能对象去调用 对象 = 类名() 通过对象执行方法 对象.方法名(xxxx) 设计,增删改查功能 函数式: def fetch(self,host,port name passwd,sql) pass def create(self,host,port name passwd,sql) pass def re