Je suis en train de concevoir une application Web de style Photoshop fonctionnant sur l'élément HTML5 Canvas. Le programme fonctionne bien et est très rapide jusqu'à ce que j'ajoute des modes de fusion dans l'équation. Je réalise des modes de fusion en fusionnant chaque élément de canevas en un seul et en combinant chaque pixel de chaque canevas en utilisant les bons modes de fusion à partir de la toile de fond.Accélérer HTML5 Rendu de pixels de canevas
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);
Avec ce mélange d'appel pour différents modes de mélange. Mon mode de fusion « normal » est la suivante:
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;
}
Mes résultats des tests dans Chrome (donnant certains des meilleurs sur les navigateurs testés) a été autour 400ms mélangeant trois couches ensemble sur une toile 620x385 (238,700 pixels).
Ceci est une très petite implémentation car la plupart des projets seront de plus grande taille et comprendront plus de couches qui feront grimper le temps d'exécution sous cette méthode.
Je me demande s'il existe un moyen plus rapide de combiner deux contextes de canevas avec un mode de fusion sans avoir à passer par tous les pixels.
Qu'est-ce que 'nextLayerPixel'? Comment le créez-vous et pourquoi le changez-vous dans la fonction 'blend' (second paramètre)? – Bergi
J'ai d'abord exclu cette partie pour montrer la fonctionnalité sans le code supplémentaire, ce qui rend désordonné, mais maintenant je l'ai ajouté. 'NextLayerPixel' est simplement une variable qui fait référence au même pixel dans chaque couche. Donc, avec un projet avec 3 couches et sur le pixel x: 30, y: 20, il va saisir le pixel de la couche inférieure à 30,20 puis au milieu 30,20 puis au sommet 30,20. –