HTML5 Canvas要素で動作するPhotoshopスタイルのWebアプリケーションを設計しています。プログラムはうまく動作し、混合モードを方程式に追加するまでは非常に高速です。各キャンバス要素を1つにマージし、各キャンバスの各ピクセルを下のキャンバスから右のブレンドモードを使用して組み合わせることで、ブレンドモードを実現します。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);
異なるブレンドモードのブレンドを呼び出します。 Chromeで
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ピクセル)に合わせて三つの層をブレンド:次のように私の「通常」ブレンドモードです。
これは非常に小さな実装です。ほとんどのプロジェクトのサイズが大きくなり、この方法では実行時間が急増するレイヤーが増えるためです。
すべてのピクセルを通過することなく、2つのキャンバスコンテキストをブレンドモードで結合する方法があれば疑問に思っています。
「nextLayerPixel」とは何ですか?どのようにしてそれを作成しますか?なぜあなたは 'blend'関数(2番目のパラメータ)でそれを変更しますか? – Bergi
私は最初にその部分を除外して、余分なコードを付け加えなくても機能を表示しましたが、これを追加しました。 'nextLayerPixel'は単に各層の同じピクセルを参照する変数です。したがって、3つのレイヤーとピクセルx:30、y:20のプロジェクトでは、30,20,20,30,20の順に下位レイヤピクセルを取得します。 –