Aar*_*ron 2 javascript html5 loops canvas
我有以下代码将图像绘制到画布并获取像素数据:
var canvas=$('#canvas'),
ctx=canvas.getContext('2d');
ctx.drawImage(img, 0, 0);
var data=ctx.getImageData(0, 0, canvas.width, canvas.height);
Run Code Online (Sandbox Code Playgroud)
这将RGBA我需要存储的值拉到一个我可以使用X/Y坐标访问的数组中.绘制到画布上的图像是黑/白图像 - 因此它会检查像素是黑色还是白色X,Y如:
imageArray[x][y]
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何循环像素数据并将其保存到2d数组中,因此我可以通过坐标来调用它.
你可以做的是遍历整个图像数据数组并提取你需要的值:
每个像素在数组中占用四个空格用于其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;
}
Run Code Online (Sandbox Code Playgroud)
ctx.getImageData返回包含.data属性的对象。
该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;
Run Code Online (Sandbox Code Playgroud)
该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
...
Run Code Online (Sandbox Code Playgroud)
您可以data像这样获取任何[x,y]像素的位置:
// the data[] array position for pixel [x,y]
var n = y * canvas.width + x;
Run Code Online (Sandbox Code Playgroud)
然后您可以像这样获取该像素的红色,绿色,蓝色和Alpha值:
var red=data[n];
var green=data[n+1];
var blue=data[n+2];
var alpha=data[n+3];
Run Code Online (Sandbox Code Playgroud)