1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 纯JavaScript实现HTML5 Canvas六种特效滤镜

纯JavaScript实现HTML5 Canvas六种特效滤镜

时间:2019-08-10 17:28:42

相关推荐

纯JavaScript实现HTML5 Canvas六种特效滤镜

纯JavaScript实现HTML5Canvas六种特效滤镜

小试牛刀,实现了六款简单常见Html5Canvas特效滤镜,并且封装成一个纯

JavaScript可调用的API文件gloomyfishfilter.js。支持的特效滤镜分别为:

1.反色

2.灰色调

3.模糊

4.浮雕

5.雕刻

6.镜像

滤镜原理解释:

1.反色:获取一个像素点RGB值r, g, b则新的RGB值为(255-r, 255-g, 255-b)

2.灰色调:获取一个像素点RGB值r, g, b则新的RGB值为

newr = (r * 0.272) + (g * 0.534) + (b * 0.131);

newg = (r * 0.349) + (g * 0.686) + (b * 0.168);

newb = (r * 0.393) + (g * 0.769) + (b * 0.189);

3.模糊:基于一个5*5的卷积核

4.浮雕与雕刻:

基于当前像素的前一个像素RGB值与它的后一个像素的RGB值之差再加上128

5.镜像:模拟了物体在镜子中与之对应的效果。

杂项准备

1.如何获取Canvas 2d context对象

varcanvas = document.getElementById("target");

canvas.width = source.clientWidth;

canvas.height = source.clientHeight;

if(!canvas.getContext) {

console.log("Canvas not supported. Please install a HTML5compatible browser.");

return;

}

// get 2D context of canvas and draw image

tempContext = canvas.getContext("2d");

2.如何绘制一个DOM img对象到Canvas对象中

varsource = document.getElementById("source");

tempContext.drawImage(source, 0, 0, canvas.width,canvas.height);

3.如何从Canvas对象中获取像素数据

varcanvas = document.getElementById("target");

varlen = canvas.width * canvas.height * 4;

varcanvasData = tempContext.getImageData(0, 0, canvas.width, canvas.height);

varbinaryData = canvasData.data;

4.如何对DOM对象实现鼠标Click事件绑定

functionbindButtonEvent(element, type, handler)

{

if(element.addEventListener){

element.addEventListener(type, handler,false);

}else{

element.attachEvent('on'+type, handler);// for IE6,7,8

}

}

5.如何调用实现的gfilter API完成滤镜功能

<scriptsrc="gloomyfishfilter.js"></script> //导入API文件

gfilter.colorInvertProcess(binaryData, len);//调用API

6.浏览器支持:IE, FF, Chrome上测试通过,其中IE上支持通过以下标签实现:

<metahttp-equiv="X-UA-Compatible"content="chrome=IE8">

效果演示:

应用程序源代码:

CSS部分:

[css]view plaincopy #svgContainer{width:800px;height:600px;background-color:#EEEEEE;}#sourceDiv{float:left;border:2pxsolidblue}#targetDiv{float:right;border:2pxsolidred}

filter1.html中HTML源代码:

[html]view plaincopy <!DOCTYPEhtml><html><head><metahttp-equiv="X-UA-Compatible"content="chrome=IE8"><metahttp-equiv="Content-type"content="text/html;charset=UTF-8"><title>CanvasFilterDemo</title><linkhref="default.css"rel="stylesheet"/><scriptsrc="gloomyfishfilter.js"></scrip></head><body><h1>HTMLCanvasImageProcess-ByGloomyFish</h1><divid="svgContainer"><divid="sourceDiv"><imgid="source"src="../test.png"/></div><divid="targetDiv"><canvasid="target"></canvas></div></div><divid="btn-group"><buttontype="button"id="invert-button">反色</button><buttontype="button"id="adjust-button">灰色调</button><buttontype="button"id="blur-button">模糊</button><buttontype="button"id="relief-button">浮雕</button><buttontype="button"id="diaoke-button">雕刻</button><buttontype="button"id="mirror-button">镜像</button></div></body></html>

filter1.html中JavaScript源代码:

[javascript]view plaincopy vartempContext=null;//globalvariable2dcontextwindow.onload=function(){varsource=document.getElementById("source");varcanvas=document.getElementById("target");canvas.width=source.clientWidth;canvas.height=source.clientHeight;if(!canvas.getContext){console.log("Canvasnotsupported.PleaseinstallaHTML5compatiblebrowser.");return;}//get2DcontextofcanvasanddrawimagetempContext=canvas.getContext("2d");tempContext.drawImage(source,0,0,canvas.width,canvas.height);//initializationactionsvarinButton=document.getElementById("invert-button");varadButton=document.getElementById("adjust-button");varblurButton=document.getElementById("blur-button");varreButton=document.getElementById("relief-button");vardkButton=document.getElementById("diaoke-button");varmirrorButton=document.getElementById("mirror-button");//bindmouseclickeventbindButtonEvent(inButton,"click",invertColor);bindButtonEvent(adButton,"click",adjustColor);bindButtonEvent(blurButton,"click",blurImage);bindButtonEvent(reButton,"click",fudiaoImage);bindButtonEvent(dkButton,"click",kediaoImage);bindButtonEvent(mirrorButton,"click",mirrorImage);}functionbindButtonEvent(element,type,handler){if(element.addEventListener){element.addEventListener(type,handler,false);}else{element.attachEvent('on'+type,handler);//forIE6,7,8}}functioninvertColor(){varcanvas=document.getElementById("target");varlen=canvas.width*canvas.height*4;varcanvasData=tempContext.getImageData(0,0,canvas.width,canvas.height);varbinaryData=canvasData.data;//Processingallthepixelsgfilter.colorInvertProcess(binaryData,len);//CopyingbackcanvasdatatocanvastempContext.putImageData(canvasData,0,0);}functionadjustColor(){varcanvas=document.getElementById("target");varlen=canvas.width*canvas.height*4;varcanvasData=tempContext.getImageData(0,0,canvas.width,canvas.height);varbinaryData=canvasData.data;//Processingallthepixelsgfilter.colorAdjustProcess(binaryData,len);//CopyingbackcanvasdatatocanvastempContext.putImageData(canvasData,0,0);}functionblurImage(){varcanvas=document.getElementById("target");varlen=canvas.width*canvas.height*4;varcanvasData=tempContext.getImageData(0,0,canvas.width,canvas.height);//Processingallthepixelsgfilter.blurProcess(tempContext,canvasData);//CopyingbackcanvasdatatocanvastempContext.putImageData(canvasData,0,0);}functionfudiaoImage(){varcanvas=document.getElementById("target");varlen=canvas.width*canvas.height*4;varcanvasData=tempContext.getImageData(0,0,canvas.width,canvas.height);//Processingallthepixelsgfilter.reliefProcess(tempContext,canvasData);//CopyingbackcanvasdatatocanvastempContext.putImageData(canvasData,0,0);}functionkediaoImage(){varcanvas=document.getElementById("target");varlen=canvas.width*canvas.height*4;varcanvasData=tempContext.getImageData(0,0,canvas.width,canvas.height);//Processingallthepixelsgfilter.diaokeProcess(tempContext,canvasData);//CopyingbackcanvasdatatocanvastempContext.putImageData(canvasData,0,0);}functionmirrorImage(){varcanvas=document.getElementById("target");varlen=canvas.width*canvas.height*4;varcanvasData=tempContext.getImageData(0,0,canvas.width,canvas.height);//Processingallthepixelsgfilter.mirrorProcess(tempContext,canvasData);//CopyingbackcanvasdatatocanvastempContext.putImageData(canvasData,0,0);}

滤镜源代码(gloomyfishfilter.js):

[javascript]view plaincopy vargfilter={type:"canvas",name:"filters",author:"zhigang",getInfo:function(){returnthis.author+''+this.type+''+this.name;},/***invertcolorvalueofpixel,newpixel=RGB(255-r,255-g,255-b)**@parambinaryData-canvas'simagedata.data*@paraml-lengthofdata(width*heightofimagedata)*/colorInvertProcess:function(binaryData,l){for(vari=0;i<l;i+=4){varr=binaryData[i];varg=binaryData[i+1];varb=binaryData[i+2];binaryData[i]=255-r;binaryData[i+1]=255-g;binaryData[i+2]=255-b;}},/***adjustcolorvaluesandmakeitmoredarkerandgray...**@parambinaryData*@paraml*/colorAdjustProcess:function(binaryData,l){for(vari=0;i<l;i+=4){varr=binaryData[i];varg=binaryData[i+1];varb=binaryData[i+2];binaryData[i]=(r*0.272)+(g*0.534)+(b*0.131);binaryData[i+1]=(r*0.349)+(g*0.686)+(b*0.168);binaryData[i+2]=(r*0.393)+(g*0.769)+(b*0.189);}},/***deepcloneimagedataofcanvas**@paramcontext*@paramsrc*@returns*/copyImageData:function(context,src){vardst=context.createImageData(src.width,src.height);dst.data.set(src.data);returndst;},/***convolution-keneralsize5*5-blureffectfilter(模糊效果)**@paramcontext*@paramcanvasData*/blurProcess:function(context,canvasData){console.log("CanvasFilter-blurprocess");vartempCanvasData=this.copyImageData(context,canvasData);varsumred=0.0,sumgreen=0.0,sumblue=0.0;for(varx=0;x<tempCanvasData.width;x++){for(vary=0;y<tempCanvasData.height;y++){//Indexofthepixelinthearrayvaridx=(x+y*tempCanvasData.width)*4;for(varsubCol=-2;subCol<=2;subCol++){varcolOff=subCol+x;if(colOff<0||colOff>=tempCanvasData.width){colOff=0;}for(varsubRow=-2;subRow<=2;subRow++){varrowOff=subRow+y;if(rowOff<0||rowOff>=tempCanvasData.height){rowOff=0;}varidx2=(colOff+rowOff*tempCanvasData.width)*4;varr=tempCanvasData.data[idx2+0];varg=tempCanvasData.data[idx2+1];varb=tempCanvasData.data[idx2+2];sumred+=r;sumgreen+=g;sumblue+=b;}}//calculatenewRGBvaluevarnr=(sumred/25.0);varng=(sumgreen/25.0);varnb=(sumblue/25.0);//clearpreviousfornextpixelpointsumred=0.0;sumgreen=0.0;sumblue=0.0;//assignnewpixelvaluecanvasData.data[idx+0]=nr;//RedchannelcanvasData.data[idx+1]=ng;//GreenchannelcanvasData.data[idx+2]=nb;//BluechannelcanvasData.data[idx+3]=255;//Alphachannel}}},/***afterpixelvalue-beforepixelvalue+128*浮雕效果*/reliefProcess:function(context,canvasData){console.log("CanvasFilter-reliefprocess");vartempCanvasData=this.copyImageData(context,canvasData);for(varx=1;x<tempCanvasData.width-1;x++){for(vary=1;y<tempCanvasData.height-1;y++){//Indexofthepixelinthearrayvaridx=(x+y*tempCanvasData.width)*4;varbidx=((x-1)+y*tempCanvasData.width)*4;varaidx=((x+1)+y*tempCanvasData.width)*4;//calculatenewRGBvaluevarnr=tempCanvasData.data[aidx+0]-tempCanvasData.data[bidx+0]+128;varng=tempCanvasData.data[aidx+1]-tempCanvasData.data[bidx+1]+128;varnb=tempCanvasData.data[aidx+2]-tempCanvasData.data[bidx+2]+128;nr=(nr<0)?0:((nr>255)?255:nr);ng=(ng<0)?0:((ng>255)?255:ng);nb=(nb<0)?0:((nb>255)?255:nb);//assignnewpixelvaluecanvasData.data[idx+0]=nr;//RedchannelcanvasData.data[idx+1]=ng;//GreenchannelcanvasData.data[idx+2]=nb;//BluechannelcanvasData.data[idx+3]=255;//Alphachannel}}},/***beforepixelvalue-afterpixelvalue+128*雕刻效果**@paramcanvasData*/diaokeProcess:function(context,canvasData){console.log("CanvasFilter-process");vartempCanvasData=this.copyImageData(context,canvasData);for(varx=1;x<tempCanvasData.width-1;x++){for(vary=1;y<tempCanvasData.height-1;y++){//Indexofthepixelinthearrayvaridx=(x+y*tempCanvasData.width)*4;varbidx=((x-1)+y*tempCanvasData.width)*4;varaidx=((x+1)+y*tempCanvasData.width)*4;//calculatenewRGBvaluevarnr=tempCanvasData.data[bidx+0]-tempCanvasData.data[aidx+0]+128;varng=tempCanvasData.data[bidx+1]-tempCanvasData.data[aidx+1]+128;varnb=tempCanvasData.data[bidx+2]-tempCanvasData.data[aidx+2]+128;nr=(nr<0)?0:((nr>255)?255:nr);ng=(ng<0)?0:((ng>255)?255:ng);nb=(nb<0)?0:((nb>255)?255:nb);//assignnewpixelvaluecanvasData.data[idx+0]=nr;//RedchannelcanvasData.data[idx+1]=ng;//GreenchannelcanvasData.data[idx+2]=nb;//BluechannelcanvasData.data[idx+3]=255;//Alphachannel}}},/***mirrorreflect**@paramcontext*@paramcanvasData*/mirrorProcess:function(context,canvasData){console.log("CanvasFilter-process");vartempCanvasData=this.copyImageData(context,canvasData);for(varx=0;x<tempCanvasData.width;x++)//column{for(vary=0;y<tempCanvasData.height;y++)//row{//Indexofthepixelinthearrayvaridx=(x+y*tempCanvasData.width)*4;varmidx=(((tempCanvasData.width-1)-x)+y*tempCanvasData.width)*4;//assignnewpixelvaluecanvasData.data[midx+0]=tempCanvasData.data[idx+0];//RedchannelcanvasData.data[midx+1]=tempCanvasData.data[idx+1];;//GreenchannelcanvasData.data[midx+2]=tempCanvasData.data[idx+2];;//BluechannelcanvasData.data[midx+3]=255;//Alphachannel}}},};

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。