gpt4 book ai didi

javascript - 从像素值推断像素位置

转载 作者:行者123 更新时间:2023-12-02 18:31:43 29 4
gpt4 key购买 nike

我正在尝试循环遍历这张黑白图像中的像素,并且我已经拼凑了人们帮助我想出的代码,但我似乎可以得到我想要的结果。我正在尝试循环通过黑色背景上白色圆圈的 PNG 图像的像素。在代码中,循环应该只访问像素的红色值,然后将它们的位置记录在单独的数组中。

有人可以尝试清理这段代码,甚至提供他们自己的方法吗?我想知道我做错了什么。我是编码初学者,确实需要有关该主题的一些帮助。

<html>
<head>

</head>

<body>
<canvas id="canvas"></canvas>
<script>
var can = document.getElementById('canvas');
var ctx = can.getContext('2d');

var img = new Image();
img.onload = function(){
can.width = img.width;
can.height = img.height;
ctx.drawImage(img, 0, 0, img.width, img.height);

var w = ctx.canvas.width, h = ctx.canvas.height;
var id = ctx.getImageData(0,0,w,h);
var d = id.data;
for (var y = 0;y < h; ++y){
for (var x = 0; x < w; ++x){

var i=(y*w+x)*4;
var r=d[i], g=d[i+1], b=d[i+2], a=d[i+3];

}
}
}
img.src = 'circle-image-alone-bw.png';



</script>
</body>

最佳答案

由于图像数据被排列为四元组(R、G、B、A),您可以像这样简单地循环:

for (var y = 0; y < d.length; y += 4) { /// skip 4 bytes each turn
var red = d[y];
}

如果您仍然得到空白数据(全为 0),则:

1)你没有正确使用onload:

var img = new Image();
img.onload = function(){
can.width = img.width;
can.height = img.height;
ctx.drawImage(img, 0, 0, img.width, img.height);

/// HERE go to getImageData
getData();
}
img.src = 'circle-image-alone-bw.png';

function getData() {
var w = ctx.canvas.width, h = ctx.canvas.height;
var id = ctx.getImageData(0,0,w,h);
var d = id.data;
for (var y = 0;y < h; ++y){
for (var x = 0; x < w; ++x){

var i=(y*w+x)*4;
var r=d[i], g=d[i+1], b=d[i+2], a=d[i+3];

}
}
}

由于图像加载是异步的,因此在设置源后立即执行 getImageData 时,您可能会面临无法访问数据的风险。因此,您需要等待图像加载准备就绪。然后执行该函数。

2) 可能 CORS (a security feature)阻止通过 getImageData()toDataURL() 获取图像数据。

canvas 使用的图像必须具有相同的来源。如果其他域用于图像(并且该域的服务器不使用访问 header )-或者-文件是从 file://协议(protocol)加载的,则 Canvas 被定义为“脏”,这意味着您将无法获取数据为字节数组。

您还可以检查控制台是否存在安全错误。

要解决此问题,有以下三个选项:

  1. 将图像移至您自己的服务器,以便它从与您的页面相同的源加载。
  2. 修改源服务器以实现 Accept-* header ,以允许从其他来源加载图像(如果您不自己管理服务器,这并不那么容易)。
  3. 使用您自己的服务器和页面作为代理:http://myserver/getImage?http://otherserver

没有其他方法可以解决这个问题。

关于javascript - 从像素值推断像素位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17731212/

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