Gibt es eine Möglichkeit, die Vormultiplikation des Alphakanals für Canvas-Daten oder eine Umgehungsmöglichkeit zu stoppen?Wie kann ich die Alpha-Premultiplikation mit canvas imageData stoppen?
Ich möchte ein Bild (in diesem Fall einige zufällige rgba Werte) erstellen und die Leinwand als Bild speichern.
Während des zweiten Schritts möchte ich das Originalbild mit dem generierten Bild unter Verwendung der imageData vergleichen, jedoch wird dies aufgrund der Vormultiplikation des Alphakanals meiner rgba Pixel im generierten Bild nicht funktionieren.
function drawImage(ctx) {
var img = ctx.createImageData(canvas.width,canvas.height);
for (var i=img.data.length;i-=4;) {
img.data[i] = Math.floor(Math.random() * 255);
img.data[i+1] = Math.floor(Math.random() * 255);
img.data[i+2] = Math.floor(Math.random() * 255);
img.data[i+3] = Math.floor(Math.random() * 255);
}
ctx.putImageData(img, 0, 0);
// our image data we just set
console.log(img.data);
// the image data we just placed onto the canvas
console.log(ctx.getImageData(0,0,canvas.width, canvas.height).data);
}
in der Konsole finden Sie zwei console.log Ausgänge finden. Das erste vor der Premultiplikation und das zweite nach der Premultiplikation. Diese beiden Ausgänge sind unterschiedlich, wobei einige Werte um 3 oder mehr abweichen. Dies ist nur dann der Fall, wenn teilweise Transparenz vorhanden ist (das Alpha wird auf einen anderen Wert als 255 gesetzt).
Gibt es eine Möglichkeit, dieselbe Ausgabe zu erhalten? Irgendwelche Ideen zu diesem Problem? Irgendwelche Ideen, wie man einen Workaround für dieses Problem erstellt?
Vielen Dank im Voraus!
Ich bin an der Antwort darauf interessiert.Nur passiert, wenn das Alpha nicht 255 ist. – Loktar
siehe die Spezifikation von putImageData, insbesondere die Endnote: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element .html # dom-context-2d-putimagedata Die einzige Lösung, die ich sehe, ist die Verwendung von webGL, um zu steuern, wie rgba gehandhabt wird. – GameAlchemist