Estoy diseñando una aplicación web al estilo de Photoshop que se ejecuta en el elemento HTML5 Canvas. El programa funciona bien y es muy rápido hasta que agregue modos de fusión en la ecuación. Alcanzo los modos de fusión fusionando cada elemento de lienzo en uno y combinando cada píxel de cada lienzo usando los modos de fusión correctos comenzando desde el lienzo inferior.Acelerar HTML5 Canvas píxel renderizado
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 él llamando mezcla de diferentes modos de mezcla. Mi modo de mezcla 'normal' es la siguiente:
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;
}
Mis resultados de la prueba en Chrome (produciendo algunos de los mejores de los navegadores probados) fue de alrededor de 400 ms mezclando tres capas juntas en un lienzo de 620x385 (238.700 pixels).
Esta es una aplicación muy pequeña como la mayoría de los proyectos serán más grandes en tamaño e incluir más capas que harán que el tiempo de ejecución se dispara bajo este método.
Me pregunto si hay alguna manera más rápida para combinar dos contextos de lona con un modo de mezcla sin tener que pasar a través de cada píxel.
¿Cuál es 'nextLayerPixel'? ¿Cómo se crea y por qué se cambia en la función 'blend' (segundo parámetro)? – Bergi
primera vez que descartar que parte para mostrar la funcionalidad sin el código extra por lo que es complicado, pero ahora he añadido en. 'NextLayerPixel' simplemente es una variable que hace referencia al mismo píxel en cada capa. Entonces, con un proyecto con 3 capas y sobre un píxel x: 30, y: 20, tomará el píxel de la capa inferior a 30,20, luego el centro 30,20 y luego el superior 30,20. –