Прежде всего, даже с сотнями масок, это не должно быть медленно, потому что требуемый алгоритм имеет сложность O (n), и это не медленно.
Единственное узкое место, которое у вас будет, этопоиск пикселей, который является дорогостоящей операцией (если вы не вносите определенные изменения).
Я бы выбрал B.
Допустим, ваши координаты мыши равны x: 400, y: 300, относительнок вашему фоновому изображению, которое имеет размеры 800x600.
Вы бы перебрали все маски и проверили:
mask.getPixel (400, 300) == white?
Если это так, используйте эту маску, смешайте ееповерх исходного изображения с определенным альфа-фактором, поэтому фон становится серым.
Узкое место: mask.getPixel () Вам придется делать это n раз, если у вас есть n масок и последняя из них.Как я уже говорил, это дорогой поиск;так что вы можете оптимизировать его?
Да, вырежьте ненужные поиски, используя: ограничивающие блоки.
Но чтобы использовать ограничивающие блоки, вы должны сначала создать данные ограничивающего прямоугольника для каждой маски, что вы могли бы сделать один раз, когдаВы загружаете (без проблем).
Ограничивающий прямоугольник определяет верхний левый и нижний правый угол, которые "ограничивают" белую область плотно.Другими словами, вы должны определить минимальную и максимальную координаты X и Y, где пиксель белый.
Если координаты мыши находятся за пределами этого поля, не пытайтесь искать, так как это точно не будет в белой области.
Редактировать: Так как мне было скучно, я пошел дальше и реализовал это ...
Проверьте это .
//preProcessMasks() & trackMouse() is where everything happens
У меня должно быть фоновое изображение "img.jpg" и маски "1.jpg" .. "5.jpg" в одной папке!
Работает с Firefox, Chrome говорит:canvas был испорчен данными из разных источников "... это быстрый и грязный хак, делай с ним что хочешь, если он тебе пригодится!