Leinwand: Maske ein Bild und speichern Sie Ihre alpha-Kanal?
Hier ist, was ich versuche zu tun:
- Bild A und Bild B. Bild B ist ein schwarz /weiß Bild mit der Maske.
- Ersetzen Bild Einen alpha-Kanal mit B Bild der rot-Kanal.
- Draw image C auf die Leinwand.
- Zeichnen Sie Ein Bild auf dem oberen Bild C.
Alles scheint ok, bis Sie zu Schritt 4. Bild C ist nicht sichtbar, und wo Ein Bild sollte transparent sein, gibt es weiße Farbe.
cx.putImageData(imageA, 0, 0);
var resultData = cx.getImageData(0, 0, view.width, view.height);
for (var h=0; h<resultData.data.length; h+=4) {
resultData.data[h+3] = imageB.data[h];
}
cx.putImageData(imageC, 0, 0);
cx.putImageData(resultData, 0, 0);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Simon hat Recht: die
putImageData
Methode nicht zahlen keine Aufmerksamkeit auf compositing; es werden lediglich Kopien pixel-Werte. Um das zu bekommen, compositing, brauchen wir Zeichenoperationen.Wir brauchen, um Durcheinander mit den Kanälen (rot in der alpha) mit der pixel-Daten, legen Sie, dass die geänderten pixel-Daten in ein Bild, und dann verwenden Sie eine composite-Betrieb, um die gewünschte Maskierung.
jsfiddle-Beispiel
Ein doodle mit dem Beispiel:
Da in Schritt 4 werden Sie mit
putImageData
die perfekt Pixel ersetzt. Sie möchten, zeichnen Sie Ein Bild oben Bild C, so kann man das nicht machen. Stattdessen möchten SiedrawImage()
So tun:
imageData
ist fast immer viel, viel langsamer als mitdrawImage
. Möglicherweise gibt es etwas anderes hier im Spiel - kann ich sehen Sie Ihre vollständige code?