多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 像素操作 **一、ImageData对象** ImageData对象中存储着canvas对象真实的像素数据,它包含以下几个只读属性: width 图片宽度,单位是像素 height 图片高度,单位是像素 data 包含着RGBA格式的整型数据,范围在0至255之间(包括255)。 我们具体来看看`data`属性: `data` 属性返回一个对象,该对象包含指定的 ImageData 对象的图像数据。 对于 ImageData 对象中的每个像素,都存在着四方面的信息,即 RGBA 值: R - 红色(0-255) G - 绿色(0-255) B - 蓝色(0-255) A - alpha 通道(0-255; 0 是透明的,255 是完全可见的) color/alpha 信息以数组形式存在,并存储于 ImageData 对象的 data 属性中。 **二、 创建一个ImageData对像** 有两个版本的 `createImageData()` 方法: **2.1 以指定的尺寸(以像素计)创建新的 ImageData 对象** ``` var imgData=cxt.createImageData(width,height); ``` 一个新的具体特定尺寸的ImageData对像。所有像素被预设为透明黑。 实例:canvas-demo/createImageData.html: 下面的代码中,我创建了一个`100*100`像素的 ImageData 对象,然后为每个像素添加颜色 ``` var imgData=cxt.createImageData(100,100); for(var i=0;i<imgData.data.length;i+=4){ imgData.data[i+0]=255; imgData.data[i+1]=0; imgData.data[i+2]=0; imgData.data[i+3]=255; } cxt.putImageData(imgData,10,10); //第一个像素变为红色 data[0]=255; //R data[1]=0; //G data[2]=0; //B data[3]=255; //A ``` **2. 2 创建与指定的另一个 ImageData 对象尺寸相同的新 ImageData 对象(不会复制图像数据)** ``` var imgData=cxt.createImageData(imageData); ``` **三、获取场景像素数据** ``` cxt.getImageData(x,y,width,height); ``` x 开始复制的左上角位置的 x 坐标(以像素计)。 y 开始复制的左上角位置的 y 坐标(以像素计)。 width 要复制的矩形区域的宽度。 height 要复制的矩形区域的高度。 例子:颜色反转 ``` var img=new Image(); img.src="mm.jpg"; img.onload=function(){ cxt.drawImage(img,10,10); var imgData=cxt.getImageData(10,10,200,300); var data=imgData.data; for(var i=0;i<data.length;i+=4){ data[i]=255-data[i]; data[i+1]=255-data[i+1]; data[i+2]=255-data[i+2]; data[i+3]=255; } cxt.putImageData(imgData,230,10); } ``` 是不是很有透视感呢。 **四、在场景中写入像素数据** ``` cxt.putImageData(imgData,x,y,dirtyX,dirtyY,dirtyWidth,dirtyHeight); ``` imgData 规定要放回画布的 ImageData 对象。 x ImageData 对象左上角的 x 坐标,以像素计。 y ImageData 对象左上角的 y 坐标,以像素计。 dirtyX 可选。水平值(x),以像素计,在画布上放置图像的位置。 dirtyY 可选。垂直值(y),以像素计,在画布上放置图像的位置。 dirtyWidth 可选。在画布上绘制图像所使用的宽度。 dirtyHeight 可选。在画布上绘制图像所使用的高度。