Ich entwerfe eine Webanwendung im Photoshop-Stil, die auf dem HTML5-Canvas-Element ausgeführt wird. Das Programm läuft gut und ist sehr schnell, bis ich Mischmodi in die Gleichung einfüge. Ich erreiche Mischmodi, indem ich jedes Canvas-Element zu einem zusammenfasse und jedes Pixel von jedem Canvas mit den richtigen Mischmodi kombiniere, die auf der unteren Leinwand beginnen.HTML5-Canvas-Pixel-Rendering beschleunigen
for (int i=0; i<width*height*4; i+=4) {
var base = [layer[0][i],layer[0][i+1],layer[0][i+2],layer[0][i+3]];
var nextLayerPixel = [layer[1][i],layer[1][i+1],layer[1][i+2],layer[1][i+3]];
//Apply first blend between first and second layer
basePixel = blend(base,nextLayerPixel);
for(int j=0;j+1 != layer.length;j++){
//Apply subsequent blends here to basePixel
nextLayerPixel = [layer[j+1][i],layer[j+1][i+1],layer[j+1][i+2],layer[j+1][i+3]];
basePixel = blend(basePixel,nextLayerPixel);
}
pixels[i] = base[0];
pixels[i+1] = base[1];
pixels[i+2] = base[2];
pixels[i+3] = base[3];
}
canvas.getContext('2d').putImageData(imgData,x,y);
Mit Aufruf für verschiedene Mischmodi aufrufen. Meine ‚normale‘ Mischmodus ist wie folgt:
var blend = function(base,blend) {
var fgAlpha = blend[3]/255;
var bgAlpha = (1-blend[3]/255)*base[3]/255;
blend[0] = (blend[0]*fgAlpha+base[0]*bgAlpha);
blend[1] = (blend[1]*fgAlpha+base[1]*bgAlpha);
blend[2] = (blend[2]*fgAlpha+base[2]*bgAlpha);
blend[3] = ((blend[3]/255+base[3])-(blend[3]/255*base[3]))*255;
return blend;
}
Meine Testergebnisse in Chrome (einige der besten aus den getesteten Browsern Nachgeben) wurde um 400 ms Mischen drei Schichten zusammen auf einer Leinwand 620x385 (238.700 Pixel).
Dies ist eine sehr kleine Implementierung, da die meisten Projekte größer sind und mehr Layer enthalten, was die Ausführungszeit unter dieser Methode in die Höhe schnellen lässt.
Ich frage mich, ob es eine schnellere Möglichkeit gibt, zwei Canvas-Kontexte mit einem Mischmodus zu kombinieren, ohne jedes Pixel durchlaufen zu müssen.
Was ist 'nextLayerPixel'? Wie erstellen Sie es und warum ändern Sie es in der Funktion "Blend" (zweiter Parameter)? – Bergi
Ich habe zuerst diesen Teil ausgeschlossen, um die Funktionalität zu zeigen, ohne den zusätzlichen Code, der es unordentlich macht, aber jetzt fügte ich ihn hinzu. 'NextLayerPixel' ist einfach eine Variable, die sich auf dasselbe Pixel in jeder Ebene bezieht. Bei einem Projekt mit 3 Ebenen und einem Pixel x: 30, y: 20 wird das Pixel der unteren Ebene bei 30,20, dann bei der mittleren 30,20 und dann bei der oberen 30,20 genommen. –