相关文章推荐

data 属性返回一个 Uint8ClampedArray ,它可以被使用作为查看初始像素数据。每个像素用 4 个 1bytes 值 (按照红,绿,蓝和透明值的顺序; 这就是"RGBA"格式) 来代表。每个颜色值部份用 0 至 255 来代表。每个部份被分配到一个在数组内连续的索引,左上角像素的红色部份在数组的索引 0 位置。像素从左到右被处理,然后往下,遍历整个数组。

Uint8ClampedArray 包含 height × width × 4 字节数据,索引值从 0 到 ( height × width × 4)-1

例如,要读取图片中位于第 50 行,第 200 列的像素的蓝色部份,你会写以下代码:

js
const blueComponent = imageData.data[50 * (imageData.width * 4) + 200 * 4 + 2];

根据行、列读取某像素点的 R/G/B/A 值的公式:

js
imageData.data[50 * (imageData.width * 4) + 200 * 4 + 0 / 1 / 2 / 3];

你可能用会使用 Uint8ClampedArray.length 属性来读取像素数组的大小(以字节为单位):

js
var numBytes = imageData.data.length;
    

创建一个 ImageData 对象

去创建一个新的,空白的 ImageData 对象,你应该会使用createImageData() 方法。有 2 个版本的 createImageData() 方法。

js
var myImageData = ctx.createImageData(width, height);

上面代码创建了一个新的具体特定尺寸的 ImageData 对象。所有像素被预设为透明黑。

你也可以创建一个被 anotherImageData 对象指定的相同像素的 ImageData 对象。这个新的对象像素全部被预设为透明黑。这个并非复制了图片数据。

js
var myImageData = ctx.createImageData(anotherImageData);
    

得到场景像素数据

为了获得一个包含画布场景像素数据的 ImageData 对象,你可以用 getImageData() 方法:

js
var myImageData = ctx.getImageData(left, top, width, height);

这个方法会返回一个 ImageData 对象,它代表了画布区域的对象数据,此画布的四个角落分别表示为 (left, top), (left + width, top), (left, top + height), 以及 (left + width, top + height) 四个点。这些坐标点被设定为画布坐标空间元素。

任何在画布以外的元素都会被返回成一个透明黑的 ImageData 对象。

这个方法也会在文章用画布操作视频中展示。

颜色选择器

在这个例子里面,我们会使用 getImageData() 去展示鼠标光标下的颜色。为此,我们要当前鼠标的位置,记为 layerX 和 layerY,然后我们去查询 getImageData() 给我们提供的在那个位置的像数数组里面的像素数据。最后我们使用数组数据去设置背景颜色和 <div> 的文字去展示颜色值。

 
推荐文章