引进于 HTML5
HTML canvas元素接口
DOM canvas元素暴露了HTMLCanvasElement
接口,该接口提供了用来操作一个canvas元素布局和呈现的属性和方法.HTMLCanvasElement
接口继承了element
接口的属性和方法.
属性
属性名 | 类型 | 描述 |
---|---|---|
height |
unsigned long |
反应出HTML中对应标签的height 属性的值,指定了该元素所占空间的高度,单位为像素. |
width |
unsigned long |
反应出HTML中对应标签的width 属性的值,指定了该元素所占空间的高度,单位为像素. |
方法
方法名和参数 | 返回值 | 描述 |
---|---|---|
getContext(in DOMString contextId) |
object |
返回canvas的绘制上下文,如果指定的上下文ID不支持,则返回null.一个绘制上下文可以让你在canvas上绘图.目前可接受的参数有"2d"和"experimental-webgl"."experimental-webgl"上下文只在那些实现了WebGL的浏览器上可用.调用getContext("2d")会返回一个 CanvasRenderingContext2D 对象,调用getContext("experimental-webgl")会返回一个WebGLRenderingContext 对象. |
toDataURL(in optional DOMString type, in any ...args) |
DOMString |
返回一个
|
|
Blob |
返回一个Blob 对象,表示了包含在该canvas中的图片文件,这个文件可能缓存在硬盘上,也可能存储在内存中,这由浏览器决定.如果没有指定type 参数,则默认使用image/png . |
mozGetAsFile(in DOMString name, in optional DOMString type) |
File |
返回一个File 对象,表示了包含在该canvas中的图片文件,这个文件是存在于内存中的.还可以指定名称和图片类型,如果没有指定type 参数,则默认使用image/png . |
void mozFetchAsStream(in |
void |
当新的数据流准备好时,则会调用指定的回调函数 注: 只能在chrome代码中使用.
|
例子: 从canvas对象中导出data: URL
首先在canvas上绘出图形,然后调用canvas.toDataURL(),就能
获取到该canvas对象中所包含图片编码后的data: URL字符串.
function test() { var canvas = document.getElementById("canvas"); var url = canvas.toDataURL(); var newImg = document.createElement("img"); newImg.src = url; document.body.appendChild(newImg); }
例子:从canvas对象中获得文件
Requires Gecko 2.0(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)你还可以从canvas元素中导出一个图片文件.下例就演示了:如何把一个canvas元素转换成图片,再把图片地址传给一个<img>
元素并显示出来.
function test() { var canvas = document.getElementById("canvas"); canvas.toBlob(function(blob) { var newImg = document.createElement("img"), url = URL.createObjectURL(blob); newImg.onload = function() { // no longer need to read the blob so it's revoked URL.revokeObjectURL(url); }; newImg.src = url; document.body.appendChild(newImg); }); }
你可以把这项技术和鼠标事件结合起来,从而可以动态的修改一张图片,下例中演示的是切换图片灰度化:
<!doctype html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>MDC Example</title> <script type="text/javascript"> function showColorImg() { this.style.display = "none"; this.nextSibling.style.display = "inline"; } function showGrayImg() { this.previousSibling.style.display = "inline"; this.style.display = "none"; } function removeColors() { var aImages = document.getElementsByClassName("grayscale"), nImgsLen = aImages.length, oCanvas = document.createElement("canvas"), oCtx = oCanvas.getContext("2d"); for (var nWidth, nHeight, oImgData, oGrayImg, nPixel, aPix, nPixLen, nImgId = 0; nImgId < nImgsLen; nImgId++) { oColorImg = aImages[nImgId]; nWidth = oColorImg.offsetWidth; nHeight = oColorImg.offsetHeight; oCanvas.width = nWidth; oCanvas.height = nHeight; oCtx.drawImage(oColorImg, 0, 0); oImgData = oCtx.getImageData(0, 0, nWidth, nHeight); aPix = oImgData.data; nPixLen = aPix.length; for (nPixel = 0; nPixel < nPixLen; nPixel += 4) { aPix[nPixel + 2] = aPix[nPixel + 1] = aPix[nPixel] = (aPix[nPixel] + aPix[nPixel + 1] + aPix[nPixel + 2]) / 3; } oCtx.putImageData(oImgData, 0, 0); oGrayImg = new Image(); oGrayImg.src = oCanvas.toDataURL(); oGrayImg.onmouseover = showColorImg; oColorImg.onmouseout = showGrayImg; oCtx.clearRect(0, 0, nWidth, nHeight); oColorImg.style.display = "none"; oColorImg.parentNode.insertBefore(oGrayImg, oColorImg); } } </script> </head> <body onload="removeColors();"> <p><img class="grayscale" src="chagall.jpg" alt="" /></p> </body> </html>
注意,这里我们得到的是一张PNG图片,你还可以在toBlob()
方法的第二个参数中指定图片类型.例如,下面的代码会得到一张JPEG格式的图片:
canvas.toBlob(function(blob){...}, "image/jpeg", 0.95); // JPEG 质量为95%
查看在线演示 (使用了mozGetAsFile()
)
浏览器支持
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 4.0 | Unknown (3.6) | 9.0 | 9.0 | 3.1 |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | 2.1 | (Yes) | (Yes) | ? | 10.0 | 3.2 |
(Opera Mini 5.0-6.0 部分支持.)