2014-02-17 45 views

回答

2

您将不得不遍历数组,因为这是评估画布中所有像素的唯一方法。

但是,您可以使用32位整数(类型)阵列,而不是标准的8位阵列 - 这将是快许多倍:

var idata = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height), 
    buffer32 = new Uint32Array(idata.data.buffer), 
    len = buffer32.length, 
    i = 0, x, y, 
    color = 0xffffffff; /// white color (ABGR format on little-endian systems) 

for(; i < len; i++) { 
    if (buffer32[i] === color) { 
     /// convert i to x/y position here 
     x = i % idata.width; 
     y = (i/idata.height)|0; 
    } 
} 
+0

你错过了W和Y之间的逗号第一线。我需要使用颜色格式的ABGR,还是我可以使用标准的十六进制?除了'ctx'和我正在寻找的颜色之外,还有什么我需要改变以使其适用于我?谢谢。 – Keavon

+0

@Keavon对于键入数组,您需要为小端系统使用ABGR(十六进制表示中的0xAABBGGRR)(现在大多数主流系统都是小端序列,所以这不会有任何问题)。 RGBA适用于大端。这是因为这些是低级别(类型)数组,并且不会有转换(当然,如果您愿意,您可以使用等效的十六进制值作为32位整数)。除此之外,将x和y推到一个数组或创建一个对象,当你得到一个命中,你应该很好去! – K3N

+0

如果我不需要alpha,我可以使用BGR吗?或者我只需要把00放在它的前面?我从来没有真正听说过ABGR。我只是简单地添加00,然后是我的HEX代码的最后两个十六进制字符,然后是中间两个,然后是前两个? – Keavon