我有以下代码将图像绘制到画布并获取像素数据:
var canvas=$('#canvas'),
ctx=canvas.getContext('2d');
ctx.drawImage(img, 0, 0);
var data=ctx.getImageData(0, 0, canvas.width, canvas.height);
这会将我需要存储的RGBA
值拉到一个我可以使用X / Y坐标访问的数组中。绘制到画布上的图像是黑/白图像 - 因此它会在X
,Y
处检查像素是黑色还是白色 - 如:
imageArray[x][y]
我无法弄清楚如何循环像素数据并将其保存到2d
数组,以便我可以通过坐标来调用它。
答案 0 :(得分:5)
您可以做的是遍历整个图像数据阵列并提取您需要的值:
每个像素在数组中占用四个空格用于其rgba值,因此我们可以循环遍历像素总数并每次从数组中获取四个值。
您可以通过将当前索引除以高度并使用y值(或列像素打开)来获取y值(或像素所在的行),使用y值从当前索引中减去行, x。
var pixels = imageData.data;
var w = imageData.width;
var h = imageData.height;
var l = w * h;
for (var i = 0; i < l; i++) {
// get color of pixel
var r = pixels[i*4]; // Red
var g = pixels[i*4+1]; // Green
var b = pixels[i*4+2]; // Blue
var a = pixels[i*4+3]; // Alpha
// get the position of pixel
var y = parseInt(i / w, 10);
var x = i - y * w;
}
答案 1 :(得分:5)
ctx.getImageData
返回包含.data
属性的对象。
该数据属性是一个已包含您正在寻找的所有像素颜色的数组。
// get the imageData object
var imageData=ctx.getImageData(0, 0, canvas.width, canvas.height);
// get the pixel color data array
var data=imageData.data;
data
数组是一个包含红色,绿色,蓝色和蓝色的长数组。画布上每个像素的alpha(不透明度)值。 data
数组的形状如下:
// top left pixel [0,0]
data[0]: Red value for pixel [0,0],
data[1]: Green value for pixel [0,0],
data[2]: Blue value for pixel [0,0],
data[3]: Alpha value for pixel [0,0],
// next pixel rightward [1,0]
data[4]: Red value for pixel [1,0],
data[5]: Green value for pixel [1,0],
data[6]: Blue value for pixel [1,0],
data[7]: Alpha value for pixel [1,0],
// and so on for each pixel on the canvas
...
你可以像data
一样获得{x,y]像素的位置:
// the data[] array position for pixel [x,y]
var n = y * canvas.width + x;
然后你可以获取该像素的红色,绿色,蓝色和像这样的alpha值:
var red=data[n];
var green=data[n+1];
var blue=data[n+2];
var alpha=data[n+3];