Sto progettando un'applicazione Web in stile Photoshop in esecuzione sull'elemento HTML5 Canvas. Il programma funziona bene ed è molto veloce fino a quando non aggiungo i modi di miscelazione nell'equazione. Ottengo le modalità di fusione unendo ciascun elemento di canvas in uno e combinando ogni pixel di ogni tela utilizzando le giuste modalità di fusione partendo dalla tela inferiore.Accelera il rendering pixel della tela HTML5
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);
Con esso chiama miscela per diverse modalità di fusione. Il mio metodo di fusione 'normale' è la seguente:
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;
}
miei risultati dei test in Chrome (producendo alcuni dei migliori fuori dei browser testati) è stato di circa 400ms mescolando tre strati insieme su una tela 620x385 (238,700 pixel).
Questa è un'implementazione molto piccola in quanto la maggior parte dei progetti avrà dimensioni maggiori e include più livelli che renderanno il tempo di esecuzione salito alle stelle con questo metodo.
Mi chiedo se ci sia un modo più rapido per combinare due contesti di canvas con una modalità di fusione senza dover passare attraverso ogni pixel.
Che cos'è 'nextLayerPixel'? Come lo crei e perché lo cambi nella funzione 'blend' (secondo parametro)? – Bergi
Per prima cosa ho escluso quella parte per mostrare la funzionalità senza il codice aggiuntivo rendendola disordinata, ma ora l'ho aggiunta. 'NextLayerPixel' è semplicemente una variabile che si riferisce allo stesso pixel in ogni livello. Quindi con un progetto a 3 strati e su pixel x: 30, y: 20, afferra il pixel del livello inferiore a 30,20 quindi a 30,20 medio e quindi a 30,20. –