Canvas 对象

Canvas 对象表示一个 HTML 画布元素 - canvas。它没有自己的行为,但是定义了一个 API 支持脚本化客户端绘图操作。

你可以直接在该对象上指定宽度和高度,但是,其大多数功能都可以通过 CanvasRenderingContext2D 对象获得。 这是通过 Canvas 对象的 getContext() 方法并且把直接量字符串 “2d” 作为唯一的参数传递给它而获得的。

canvas 标记在 Safari 1.3 中引入,在制作此参考页时,它在 Firefox 1.5 和 Opera 9 中也得到了支持。在 IE 中,canvas 标记及其 API 可以使用位于 excanvas.sourceforge.net 的 ExplorerCanvas 开源项目来模拟。

Canvas 对象的属性

height 属性

画布的高度。和一幅图像一样,这个属性可以指定为一个整数像素值或者是窗口高度的百分比。当这个值改变的时候,在该画布上已经完成的任何绘图都会擦除掉。默认值是 300。

width 属性

画布的宽度。和一幅图像一样,这个属性可以指定为一个整数像素值或者是窗口宽度的百分比。当这个值改变的时候,在该画布上已经完成的任何绘图都会擦除掉。默认值是 300。

<canvas id="myCanvas" width="200" height="100"></canvas>

Canvas 对象的方法

getContext()

返回一个用于在画布上绘图的环境。

大多数 Canvas 绘图 API 都没有定义在 canvas 元素本身上,而是定义在通过画布的 getContext() 方法获得的一个“绘图环境”对象上。

getContext(“2d”) 对象是内建的 HTML5 对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法

<script type="text/javascript">
var c=document.getElementById("myCanvas"); //JavaScript 使用 id 来寻找 canvas 元素
var cxt=c.getContext("2d");  //创建 context 对象
cxt.fillStyle="#FF0000";  //fillStyle 方法将其染成红色
cxt.fillRect(0,0,150,75);  //fillRect 方法规定了形状、位置和尺寸 (x, y, width, height)
</script>

Canvas API 也使用了路径的表示法。但是,路径由一系列的方法调用来定义,而不是描述为字母和数字的字符串,比如调用 beginPath() 和 arc() 方法。

一旦定义了路径,其他的方法,如 fill(),都是对此路径操作。绘图环境的各种属性,比如 fillStyle,说明了这些操作如何使用。

注释:Canvas API 非常紧凑的一个原因上它没有对绘制文本提供任何支持。要把文本加入到一个 canvas 图形,必须要么自己绘制它再用位图图像合并它,或者在 canvas 上方使用 CSS 定位来覆盖 HTML 文本。

Canvas 实例

下面实例都要用到的canvas 元素:

<canvas id="myCanvas" width="200" height="100" style="border:1px solid #c3c3c3;">
Your browser does not support the canvas element.
</canvas>
线条

通过指定从何处开始,在何处结束,来绘制一条线:

线条

<script type="text/javascript">
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
cxt.moveTo(10,10);
cxt.lineTo(150,50);
cxt.lineTo(10,50);
cxt.stroke();
</script>
圆形

通过规定尺寸、颜色和位置,来绘制一个圆:

圆形

<script type="text/javascript">
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
cxt.fillStyle="#FF0000";
cxt.beginPath();
cxt.arc(70,18,15,0,Math.PI*2,true);
cxt.closePath();
cxt.fill();
</script>
渐变

使用指定的颜色来绘制渐变背景:

渐变

<script type="text/javascript">
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
var grd=cxt.createLinearGradient(0,0,175,50);
grd.addColorStop(0,"#FF0000");
grd.addColorStop(1,"#00FF00");
cxt.fillStyle=grd;
cxt.fillRect(0,0,175,50);
</script>
图片

把一幅图像放置到画布上:

图片

<script type="text/javascript">
/*  
绘制图片  
	图片预加载,获取图片文件  
	onload中调用  
	drawImage(img,x,y,w,h);绘制图片(图片,坐标x,坐标y,宽度,高度)  
*/  
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
var img=new Image()
img.src="flower.png"
img.onload = function () {
    cxt.drawImage(img,0,0);
}
</script>
绘制背景
<script type="text/javascript">
/*  
设置背景  
	createPattern(img,平铺方式)  
	平铺方式:repeat,repeat-x,repeat-y,no-repeat  
*/ 
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
var img=new Image()
img.src="flower.png"
img.onload = function () {
	var bg = cxt.createPattern(img,"no-repeat");  
	cxt.fillStyle = bg;  
	cxt.fillRect(0,0,c.width,c.height);  //.fillRect(x,y,width,height);
}
</script>
canvas保存图片

canvas在浏览器端,不能实现保存图片功能,要实现该功能,需要将canvas转成图片的形式呈现,这里就需要调用toDataURL()方法,并赋给image的src的属性,然后保存图片

调用toDataURL()方法时,如果canas中应用了图片或者背景图片,这里有2点需要注意:

  • 需要在图片的onload事件中调用toDataURL()方法
  • 图片和访问链接需要允许跨域请求

受限于 CORS 策略,会存在跨域问题,虽然可以使用图像(比如append到页面上)但是绘制到画布上会污染画布,一旦一个画布被污染,就无法提取画布的数据,比如无法使用使用画布toBlob(),toDataURL(),或getImageData()方法;当使用这些方法的时候 会抛出如下安全错误

Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

解决这个问题,需要2步

1.图片设置 :crossOrigin属性

代码片段:img.setAttribute(“crossOrigin”,’Anonymous’)

注:该代码需要写在img.src的前面,才能生效

2.需要服务器端代码允许,资源跨域使用,也就是设置CORS跨域配置,Access-Control-Allow-Origin

2个小例子