【问题标题】:Is it possible to getImageData once and pull data after on specific places?是否可以一次获取图像数据并在特定位置之后提取数据?
【发布时间】:2013-03-09 01:38:00
【问题描述】:

为了从特定坐标的图像中获取颜色,我使用了这个答案get-pixel-color-from-canvas-on-mouseover。但是,在 Microsoft 第 56 页的 Powerpoint 上,它说 getImageData 必须使用一次,因为来自显卡的调用非常密集。他们举了一个例子,但它是为了分析整个画面。

有没有办法只使用一次 getImageData,然后只分析来自特定 x 和 y 坐标的数据,就像我说的 5 个随机位置一样?

编辑:用于检查示例所做的每个像素:

var imageData = ctx.getImageData(0, 0, width, height);
var inputData = imageData.data;

for(var y = 0; y < height; y++) {
    for (car x = 0; x <width; x++) {
       var r = inputData[i+0];
var g = inputData[i+1];
var b = inputData[i+2];

但我想要的是它确实像下面那样,但在外面有 imageData: 如何读取包含我想要的位置的数组?因为括号里的数字是颜色值类型(r,g,b)

for (var i=0; i<slider; i++)
{
    var objectx = position.getX();
    var objecty = position.getY();
    var imageData = context.getImageData(objectx, objecty, 1, 1).data; 
    var hex = "#" + ("000000" + rgbToHex(p[0], p[1], p[2])).slice(-6);
}

【问题讨论】:

  • 您能不能说的详细点......??
  • 是的,您可以使用 getImageData 一次,并可以针对特定的 x 和 y 对其进行 n 次分析,因为图像数据将存储在数组变量中,并且在您分配其他变量之前不会更改数组的值 ...
  • 为了更清楚,我已经编辑了我的问题。希望对你有帮助

标签: javascript image html canvas


【解决方案1】:

以下内容很容易做到。

Live Demo

var imageData = ctx.getImageData(0, 0, width, height);
var inputData = imageData.data; 

var pData = (~~objectx + (~~objecty * width)) * 4;
var r = inputData[pData],
    g = inputData[pData + 1],
    b = inputData[pData + 2],
    a = inputData[pData + 3];

~~ 只是一种更快的方式来处理Math.floor。其余的应该是非常不言自明的。只需将objectxobjecty 更改为您需要的任何值并继续检查inputData,只要图像没有更改,就不需要再次getImageData

【讨论】:

  • 谢谢你,效果很好。它不仅有效,而且如果您阅读代码,它还解释了 imageData 的功能。太好了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 2022-01-04
  • 2014-01-23
  • 1970-01-01
相关资源
最近更新 更多