Płótno API posiada metody teraz składanie specjalnie na takie rzeczy jak „wyciągnąć jedynie na piksele, które nie są przezroczyste w oryginalnym obrazie.” Jest to znacznie łatwiejsze niż zakłócanie danych obrazu.
jsFiddle przykład (teraz z inlined obrazu)
wskazówka kapelusz do pierwotnego użytkownika @ WilliamVanRensselaer skrzypcach.
Operacja złożona, którą chcesz wykonać, to source-in
, co oznacza "narysuj nieprzezroczyste części tego, co próbuję namalować tylko tam, gdzie znajdują się one na nieprzezroczystych pikselach na rysowanym obrazie".
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);
}
reference
+1 za użycie opcji 'globalCompositeOperation' zamiast zafałszowania danymi obrazu. To powinno być lepsze niż inne (całkowicie poprawne) rozwiązanie. – Phrogz
To jest idealne, ellisbben! Jest to nie tylko szybsze, o czym wspomniał Phrogz, ale także pozwala uniknąć problemów związanych z zezwoleniem na pochodzenie, co czyni go bardziej odpowiednim w różnych sytuacjach. Twoje zdrowie! –