2014-02-17 4 views
0

Мне нужен способ найти координаты каждого пикселя с определенным цветом. Я мог бы прокручивать каждый пиксель во всем изображении и проверять, соответствует ли это, но это не кажется очень эффективным. Есть ли способ лучше?Найти координату соответствия холста HTML5 заданного цвета

ответ

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

Вы пропустили запятую между у и ш на первом линия. Нужно ли использовать ABGR для цветового формата, или я могу использовать стандартный hex? Помимо 'ctx' и моего цвета, который я ищу, есть ли что-то еще, что мне нужно изменить, чтобы заставить его работать на меня? Спасибо. – Keavon

+0

@Keavon с типизированным массивом вам нужно использовать ABGR (0xAABBGGRR в шестнадцатеричном представлении) для небольших систем endian (большинство систем с основным потоком сегодня мало endian, так что это не будет проблемой). RGBA для big-endian. Это потому, что это низкоуровневые (типизированные) массивы, и конверсии не будет (вы можете, конечно, использовать эквивалент шестнадцатеричного значения как 32-битное целое, если хотите). Помимо этого, нажимайте x и y на массив или создавайте объект, когда вы получаете удар, и вы должны быть добрым! – K3N

+0

Если мне не нужна альфа, я могу использовать BGR? Или мне просто нужно положить 00 перед ним? Я никогда не слышал об ABGR раньше. Я просто добавляю 00, а затем два последних шестнадцатеричных символа моего кода HEX, а затем в середине два, затем первые два? – Keavon

Смежные вопросы