gpt4 book ai didi

javascript - 从 HTML5 Canvas 垂直迭代像素

转载 作者:行者123 更新时间:2023-11-30 10:28:44 25 4
gpt4 key购买 nike

我正在尝试在图像中找到其中包含数据的第一个垂直和水平行。

我很容易得到第一个水平行,因为在调用 getImageData 时,生成的像素数据数组是逐行水平存储的。我有这样的数据:

var data = context.getImageData(0, 0, width, height).data;
var heightFirst = 0;

for (var r = 0; r <= data.length; r += 4) {
if (data[r + 3] > 0) {
var y = (r / width) / 4;
heightFirst = y;
break;
}
}

我现在需要垂直迭代数据。我意识到这可能是使用嵌套的 for 循环并执行如下操作来完成的:

for (var r = 0; r <= data.length; r += 4) {
for (var c = 0; c < canvasHeight; c++) {
if (data[(r + 3) + (c * width)] > 0) {

}
}
}

我不确定确切的实现/计算谁能帮我??

编辑

正如@bobbybee 和@danielpolencic 所提到的,递增 4 * width 的循环将递增垂直列:

for (var r = 0; r <= data.length; r += (4 * width)) {
if (data[r + 3] > 0) {
// do whatever
}
}

但是,这只会获取第一列像素的信息。我想下一步是重复上面的循环,但是用这样的循环增加它的列数(由于颜色数据乘以 4):

for (var c = 0; c < canvas.width; c ++) {
for (var r = 0; r <= data.length; r += ((4 * canvas.width) + (c * 4))) {
if (data[r + 3] > 0) {
firstX = c;
}
}
}

这似乎不太对。我把它贴在 this fiddle 上,如您所见,它应该返回 10,因为这是左起第一列,但它正在将 99 写入日志。感觉我很亲近!

最佳答案

您可以在一个循环中完成所有操作,而无需嵌套。

Live Demo

var minX = canvas.width,
minY = canvas.height;

for (var p = 0; p <= data.length; p += 4) {
var curX = (p / 4) % canvas.width,
curY = ((p / 4) - curX) / canvas.width;

/* if what we're checking is higher than our recorded minX and
minY skip to the next row */

if(curX > minX && curY > minY){
// if minY is greater than 0 continue, if its 0 it can be no less so break.
if(minY > 0){
p=(curY+1)*(canvas.width*4);
}else{
break;
}
}

if (data[p + 3] > 0) {
if (curX < minX) {
minX = curX;
};

if (curY < minY) {
minY = curY;
};
}
}

下面是从一维数组中获取x和y的公式

X = Index % Width

Y = (Index - x) / Width

在我们的例子中,因为我们处理的像素数据被分成 4 个分量值 (r/g/b/alpha),所以我们需要像我在上面的演示中那样将索引除以 4。

接下来我使用 minXminY 设置 Canvas 的宽度和高度。每当我们命中一个像素时,我们都会检查它的 xy 是否低于我们存储的最低 xy 。如果它们较低,那么我们保留该值并继续前进。

然而它更容易阅读,并且 faster 使用多个循环来读取数据。

for (var x = 0; x <= canvas.width; x++) {
for (var y = 0; y <= canvas.height; y++) {
if (minY < y) {
break;
}
if (data[((y * canvas.width + x) * 4) + 3] > 0) {
if (x < minX) {
minX = x;
}
if (y < minY) {
minY = y;
}
}
}
}

Demo to get the lastX and lastY

for (var x = 0; x <= canvas.width; x++) {
for (var y = 0; y <= canvas.height; y++) {
if (data[((y * canvas.width + x) * 4) + 3] > 0) {
if (x < firstX) {
firstX = x;
}
if (y < firstY) {
firstY = y;
}

if (x > lastX) {
lastX = x;
}
if (y > lastY) {
lastY = y;
}
}
}
}

关于javascript - 从 HTML5 Canvas 垂直迭代像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18218530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com