canvas支持直接获取和修改画布中每一个像素点的信息,这些信息全部被存放在ImageData对象中。
一、ImageData对象
ImageData对象中存储着canvas对象真实的像素数据,它包含以下几个只读属性:
- width:图片宽度,单位是像素。
- height:图片高度,单位是像素。
- data:图片所有像素点信息,是一个一维数组,元素类型是Uint8ClampedArray。储存像素信息的方式是自图片的左上角开始,从左往右、由上自下依次存入每个像素点的RGBA四个值。这个数组包含高度 × 宽度 × 4 bytes数据,索引值从0到(
高度×宽度×4)-1。
二、新建ImageData对象
可以使用ctx.createImageData方法来新建一个所有像素都为rgba(0, 0, 0, 0)的ImageData对象:
1 | // 新建具体尺寸的ImageData对象 |
三、获取图片像素数据
通过ctx.getImageData方法来获取图片的数据:
1 | // 获取一个以(x, y)为左上角,宽高分别为width和height的矩形的像素数据,如果范围超出了canvas,将会得到rgba(0, 0, 0, 0) |
四、写入图片像素数据
可以用putImageData方法去对场景进行像素数据的写入
1 | // 以(x, y)为左上角在canvas上绘制newImageData |
五、保存图片
canvas对象提供了toDataURL方法来保存当前图片,分辨率是96dpi:
canvas.toDataURL('image/png', quality):可以创建一个png格式的图片,quality代表图片质量,取值从0到1,1最好。canvas.toBlob(callback, type, encoderOptions):通过canvas创建一个blob对象。
以上两种方法创建的对象都可以用于任何img标签,也可以通过具有download属性的元素来下载(例如在chrome中给a标签设置download属性,这样在点击时就不会跳转页面而是直接下载)。