В Canvas API есть методы компоновки специально для таких вещей, как «рисовать только на пикселях, которые не прозрачны на исходном изображении».Это гораздо проще, чем возиться с данными изображения.
jsFiddle пример (теперь со встроенным изображением)
подсказка к исходной скрипке @ WilliamVanRensselaer.
Требуется составная операция source-in
, что означает «рисовать непрозрачные части того, что я пытаюсь нарисовать, только там, где они находятся поверх непрозрачных пикселей на рисуемом изображении».
HTML:
<a href="javascript:doIt()">paint non-transparent regions white</a><br>
<canvas id="canvas" width="600" height="200"></canvas>
Javascript:
var canvas = document.getElementById( "canvas" ),
ctx = canvas.getContext( "2d" );
imgSrc = "http://d.pr/Td69+";
var b = document.getElementsByTagName("body")[0];
var i = document.createElement("img");
i.src = imgSrc;
i.style.setProperty("display", "none");
i.onload = function() {
ctx.drawImage(i, 0, 0);
}
b.appendChild(i);
window.doIt = function() {
ctx.globalCompositeOperation = "source-in";
ctx.fillStyle = "#ffffff";
ctx.fillRect(0, 0, 600, 200);
}
ссылка