HTML5画布图像过滤器滞后(JavaScript)
我试图将一个全屏背景图像加载到画布上,然后对其应用图像过滤器,但有几个问题。我遇到了严重的性能问题,但只是在调整窗口大小时。基本上,我的代码试图保持画布/图像与屏幕尺寸匹配(这很好) 更新画布方法: updateCanvas方法在加载时被调用,以最初创建/加载图像对象并将其放置在画布上。如果选择了筛选器,它将调用筛选器方法。它接受onResize参数,该参数在调整窗口大小时传递以缩放画布/图像。MAIN是指用于引用元素的对象HTML5画布图像过滤器滞后(JavaScript),javascript,html,loops,canvas,filter,Javascript,Html,Loops,Canvas,Filter,我试图将一个全屏背景图像加载到画布上,然后对其应用图像过滤器,但有几个问题。我遇到了严重的性能问题,但只是在调整窗口大小时。基本上,我的代码试图保持画布/图像与屏幕尺寸匹配(这很好) 更新画布方法: updateCanvas方法在加载时被调用,以最初创建/加载图像对象并将其放置在画布上。如果选择了筛选器,它将调用筛选器方法。它接受onResize参数,该参数在调整窗口大小时传递以缩放画布/图像。MAIN是指用于引用元素的对象 updateCanvas:function(onResize){
updateCanvas:function(onResize){
// SETUP VARIABLES
var img=new Image(),
$this=Main.currentOBJ, // REFERENCE FOR .DATA
objData=$this.data,
canvas=Main.OBJ.$Canvas[0],
ctx=canvas.getContext("2d"),
winW=$(window).width(), winH=$(window).height();
// SOURCE CAN BE SET IN .DATA OR DEFAULT
img.src=(objData.bg_pic_src!=='') ? objData.bg_pic_src : Main.ConSRC;
// LOAD THE IMAGE OBJECT
img.onload=function(){
var imgW=img.width, imgH=img.height,
ratio=imgW/imgH, newW=winW, newH=Math.round(newW/ratio);
// SETUP IMAGE PROPORTIONS
if(newH < winH){ var newH=winH, newW=Math.round(newH*ratio); };
// WHEN RESIZING THE BROWSER
if(!onResize){ // INTIAL DRAW
Main.OBJ.$Canvas.attr({'width':newW+'px', 'height':newH+'px'});
ctx.drawImage(img,0,0,newW,newH);
// APPLY FILTERS
if(objData.bg_pic_filter > 0){
Main.canvasFilter(ctx,newW,newH); // FILTER METHOD
}else{
Main.OBJ.$OverlayPic.animate({opacity:parseFloat(objData.bg_pic_opacity,10)},
{duration:objData.bg_pic_speed_in,queue:false});
};
}else{ // RESIZING
Main.OBJ.$Canvas.attr({'width':newW+'px', 'height':newH+'px'});
ctx.drawImage(img,0,0,newW,newH);
if(objData.bg_pic_filter > 0){
Main.canvasFilter(ctx,newW,newH); // FILTER METHOD
};
};
};
所有这些都有效,并且初始绘制/过滤速度非常快。然而,当我调整窗口大小时,它非常缓慢。我通过设置一个节流器暂时解决了这个问题,它只是设置了一个计时器,以避免过快地启动上述功能。这有点帮助,但会将背景图像保持在原位(在图像周围显示打开的实心背景区域),直到节流计时器启动并触发方法-调整画布/图像的大小并应用过滤器
问题:
很抱歉,这是一个龙龙的问题,但希望这能涵盖一些其他人也能从中受益的话题。如有任何建议/提示,将不胜感激。谢谢!:) 因为听起来您的图像大多是静态的,所以您可能希望尝试使用好的旧css 这里的关键技巧是使用背景大小:封面。见: 因此,广义而言:
ctx.toDataUrl(“image/png”)代码>
背景尺寸:封面;背景:url('data:image/png;yourcanvasdata')代码>
我是否正确地理解了加载时的所有行为,只是调整窗口大小是个问题?如果是,为什么要重新绘制画布,而不是使用canvas.style.width=“1234px”调整大小?如果没有,在线版本将有助于理解,因为您似乎期望获得上文未描述的独特效果。对于其他画布绘制循环,您可能还需要阅读有关window.requestAnimationFrame的信息。基本上,浏览器会让你知道什么时候可以工作,而不是等待任意的时间。看:很好!这听起来很棒,我对画布操作还是相当陌生,不知道.toDataUrl。听起来很完美:)
canvasFilter:function(ctx,width,height){
// SETUP VARIABLES
var objData=Main.currentOBJ.data,
canvasWidth=width, canvasHeight=height,
imgdata=ctx.getImageData(0, 0, canvasWidth, canvasHeight),
pix=imgdata.data, l=pix.length;
// APPLY THE CORRECT LOOP DEPENDING UPON THE FILTER NUMBER
switch(objData.bg_pic_filter){
case 1: ... break;
case 2:
for(var i=l; i>0; i-=4){
var cacher=pix[i+2];
pix[i]=pix[i+1];
pix[i+1]=cacher;
pix[i+2]=cacher;
pix[i+3]=cacher;
};
break;
};
// APPLY THE FILER & FADE IN THE BACKGROUND
ctx.putImageData(imgdata, 0, 0);
Main.OBJ.$OverlayPic.fadeTo(parseInt(objData.bg_pic_speed_in,10),
parseFloat(objData.bg_pic_opacity,10));
};