キャンバスタグを使用して少しフルスクリーンの背景オーバーレイを接続し終えましたが、パフォーマンスの壁にぶつかりました。私が行ったことは、#OverlayPicというコンテナーを作成し、それを100%x 100%、display:noneに設定することです。このコンテナの中には私のcanvas要素があります。
起動すると、jQueryは画像をキャンバスにロードし、ピクセル情報を配列として取得します。switchステートメントは、ユーザーが希望するフィルター効果のために設定したオプションを受け入れます。コードはすべて機能しますが、ひどく遅いです(そして、それは主に私がそれをどのように構造化したかによると思いますが、より良いアプローチはわかりません)。
updateCanvas:function(onResize){
var img=new Image(); img.src=Main.ConSRC,
img.onload=function(){
var canvas=document.getElementById('Box_Canvas'),
ctx=canvas.getContext("2d"),
winW=$(window).width(), winH=$(window).height(),
imgW=this.width, imgH=this.height, smallestSide=Math.min(imgW,imgH);
// SETUP IMAGE PROPORTIONS
switch(smallestSide){
case imgW:
var width=winW,height=width*(imgW/imgH);
if(height < winH){ var height=winH, width=height*(imgW/imgH); };
break;
case imgH:
var height=winH,width=height*(imgW/imgH);
if(width < winW){ var width=winW, height=width*(imgH/imgW); };
break;
};
// DRAW IMAGE ON THE CANVAS
ctx.clearRect(0, 0, width*1.3, height*1.3 );
ctx.drawImage(img,0,0,width*1.3,height*1.3);
// IMAGE FILTERS
var imgdata=ctx.getImageData(0, 0, width, height), pix=imgdata.data, l=pix.length;
switch($this.data.bg_pic_filter){
// all filter code cases are here...
};
// APPLY THE FILER
ctx.putImageData(imgdata, 0, 0);
// FADE IN OVERLAY
if(!onResize){
Main.OBJ.$OverlayPic.fadeTo( $this.data.bg_pic_speed, $this.data.bg_pic_opacity);
};
};
},
この関数は2か所で呼び出されています。
ユーザーが割り当てられた要素をクリックすると、オーバーレイがフェードインし、フィルタリングされた画像がキャンバスに読み込まれます。
ウィンドウのサイズ変更イベント(onResize arg)で、適用されたフィルターを維持するために、そうでない場合は、デフォルトで元の画像に戻りますか?
誰かが最適化の提案がありますか?ありがとう!