我正在設計一個運行在HTML5 Canvas元素上的Photoshop風格的Web應用程序。該程序運行良好,並非常迅速,直到我將混合模式添加到方程中。我通過將每個畫布元素合併爲一個,並使用從底部畫布開始的正確混合模式組合每個畫布中的每個像素來實現混合模式。加快HTML5 Canvas像素渲染
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);
它調用混合爲不同的混合模式。我的「正常」混合模式如下:
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;
}
我的測試結果在鉻(產生一些最好出測試的瀏覽器的)圍繞400ms的畫布620x385(238700個像素)上進行混合三層在一起。
這是一個非常小的實現,因爲大多數項目的尺寸會更大,並且會包含更多圖層,這會使得執行時間在此方法下急劇增加。
我想知道是否有更快的方式來結合兩個畫布上下文與混合模式,而不必通過每個像素。
'nextLayerPixel'是什麼?你如何創建它,爲什麼你在'blend'函數(第二個參數)中改變它? – Bergi 2012-08-03 02:49:15
我首先排除了那部分顯示功能,沒有額外的代碼使它變得混亂,但現在我添加了它。'nextLayerPixel'只是一個變量,指的是每一層中的相同像素。因此,對於具有3個圖層並且像素爲x:30,y:20的項目,它將在30,20,然後是中間30,20,然後是頂部30,20抓取底層像素。 – 2012-08-03 02:55:22