canvas滤镜效果实现代码
本文实例为大家分享了canvas实现滤镜效果的具体代码,供大家参考,具体内容如下
<!DOCTYPEhtml> <html> <headlang="en"> <metacharset="UTF-8"> <title>canvas-滤镜</title> <style> canvas{ border:1pxsolidred; float:left; /*background-color:red;*/ } </style> </head> <body> <canvasid="oldCanvas"width="500px"height="300px"> </canvas> <canvasid="nowCanvas"width="500px"height="300px"> </canvas> <buttononclick="copy2()">底片效果</button><br> <buttononclick="copy3()">黑白效果</button><br> <buttononclick="copy4()">浮雕效果</button><br> <buttononclick="copy1()">灰色滤镜</button><br> <buttononclick="copy5()">绿色滤镜</button><br> <buttononclick="copy6()">蓝色滤镜</button><br> <buttononclick="copy7()">红色滤镜</button><br> <buttononclick="copy8()">黄色滤镜</button><br> <buttononclick="copy9()">紫色滤镜</button><br> <buttononclick="copy10()">青色滤镜</button><br> <script> //获取到canvas元素 varoldcanvas=document.getElementById('oldCanvas'); //获取canvas中的画图环境 varoldcontext=oldcanvas.getContext('2d'); //获取到canvas元素 varnowcanvas=document.getElementById('nowCanvas'); //获取canvas中的画图环境 varnowcontext=nowcanvas.getContext('2d'); varimg=newImage(); img.src="./image/liuyifei.jpg"; window.onload=function(){ //绘制图像 oldcontext.drawImage(img,0,0,oldcanvas.width,oldcanvas.height); copy1(); }; //灰度效果 functioncopy1(){ //获取ImageData的属性:width,height,data(包含RGBA四个值); varimgdata=oldcontext.getImageData(0,0,oldcanvas.width,oldcanvas.height); for(vari=0;i<imgdata.data.length;i+=4){ //计算获取单位元素的RBG然后取平均值然后复制给自身得到灰色的图像 varavg=(imgdata.data[i]+imgdata.data[i+1]+imgdata.data[i+2])/3; imgdata.data[i]=avg; imgdata.data[i+1]=avg; imgdata.data[i+2]=avg; } //将图像信息绘制第二个canvas中,注:一般只能在服务下运行 nowcontext.putImageData(imgdata,0,0); } //底片效果 functioncopy2(){ //获取ImageData的属性:width,height,data(包含RGBA四个值); varimgdata=oldcontext.getImageData(0,0,oldcanvas.width,oldcanvas.height); for(vari=0;i<imgdata.data.length;i+=4){ //将所有的RGB值重新赋值(底片效果=255-当前的RGB值) imgdata.data[i]=255-imgdata.data[i]; imgdata.data[i+1]=255-imgdata.data[i+1]; imgdata.data[i+2]=255-imgdata.data[i+2]; } //将图像信息绘制第二个canvas中,注:一般只能在服务下运行 nowcontext.putImageData(imgdata,0,0); } //黑白效果 functioncopy3(){ //获取ImageData的属性:width,height,data(包含RGBA四个值); varimgdata=oldcontext.getImageData(0,0,oldcanvas.width,oldcanvas.height); for(vari=0;i<imgdata.data.length;i+=4){ //计算获取单位元素的RBG然后取平均值 varavg=(imgdata.data[i]+imgdata.data[i+1]+imgdata.data[i+2])/3; imgdata.data[i]=avg>128?255:0; imgdata.data[i+1]=avg>128?255:0; imgdata.data[i+2]=avg>128?255:0; } //将图像信息绘制第二个canvas中,注:一般只能在服务下运行 nowcontext.putImageData(imgdata,0,0); } //浮雕效果 functioncopy4(){ //获取ImageData的属性:width,height,data(包含RGBA四个值); varimgdata=oldcontext.getImageData(0,0,oldcanvas.width,oldcanvas.height); for(vari=0;i<imgdata.data.length;i+=4){ //浮雕效果的算法:当前RGB减去相邻的GRB得到的值再加上128 imgdata.data[i]=imgdata.data[i]-imgdata.data[i+4]+128; imgdata.data[i+1]=imgdata.data[i+1]-imgdata.data[i+5]+128; imgdata.data[i+2]=imgdata.data[i+2]-imgdata.data[i+6]+128; //计算获取单位元素的RBG然后取平均值再次灰度,优化浮雕的效果 varavg=(imgdata.data[i]+imgdata.data[i+1]+imgdata.data[i+2])/3; imgdata.data[i]=avg; imgdata.data[i+1]=avg; imgdata.data[i+2]=avg; } //将图像信息绘制第二个canvas中,注:一般只能在服务下运行 nowcontext.putImageData(imgdata,0,0); } //绿色滤镜 functioncopy5(){ //获取ImageData的属性:width,height,data(包含RGBA四个值); varimgdata=oldcontext.getImageData(0,0,oldcanvas.width,oldcanvas.height); for(vari=0;i<imgdata.data.length;i+=4){ //绿色滤镜的算法:当前绿色通道值G*1.4得到绿色滤镜 varg=imgdata.data[i+1]*1.4; //注:当前值大于255时将其赋值255 imgdata.data[i+1]=g>255?255:g; } //将图像信息绘制第二个canvas中,注:一般只能在服务下运行 nowcontext.putImageData(imgdata,0,0); } //蓝色滤镜 functioncopy6(){ //获取ImageData的属性:width,height,data(包含RGBA四个值); varimgdata=oldcontext.getImageData(0,0,oldcanvas.width,oldcanvas.height); for(vari=0;i<imgdata.data.length;i+=4){ //蓝色滤镜的算法:当前蓝色通道值变为原来的1.6得到蓝色滤镜 varb=imgdata.data[i+2]*1.6; //注:当前值大于255时将其赋值255 imgdata.data[i+2]=b>255?255:b; } //将图像信息绘制第二个canvas中,注:一般只能在服务下运行 nowcontext.putImageData(imgdata,0,0); } //红色滤镜 functioncopy7(){ //获取ImageData的属性:width,height,data(包含RGBA四个值); varimgdata=oldcontext.getImageData(0,0,oldcanvas.width,oldcanvas.height); for(vari=0;i<imgdata.data.length;i+=4){ //红色滤镜的算法:当前红色通道值变为原来的2得到红色滤镜 varr=imgdata.data[i]*2; //注:当前值大于255时将其赋值255 imgdata.data[i]=r>255?255:r; } //将图像信息绘制第二个canvas中,注:一般只能在服务下运行 nowcontext.putImageData(imgdata,0,0); } //黄色滤镜 functioncopy8(){ //获取ImageData的属性:width,height,data(包含RGBA四个值); varimgdata=oldcontext.getImageData(0,0,oldcanvas.width,oldcanvas.height); for(vari=0;i<imgdata.data.length;i+=4){ //黄色滤镜的算法:红色通道值和绿色通道值增加50(红色+绿色=黄色) varr=imgdata.data[i]+50; varg=imgdata.data[i+1]+50 //注:当前值大于255时将其赋值255 imgdata.data[i]=r>255?255:r; imgdata.data[i+1]=g>255?255:g; } //将图像信息绘制第二个canvas中,注:一般只能在服务下运行 nowcontext.putImageData(imgdata,0,0); } //紫色滤镜 functioncopy9(){ //获取ImageData的属性:width,height,data(包含RGBA四个值); varimgdata=oldcontext.getImageData(0,0,oldcanvas.width,oldcanvas.height); for(vari=0;i<imgdata.data.length;i+=4){ //紫色滤镜的算法:红色通道值和蓝色通道值增加50(红色+蓝色=紫色) varr=imgdata.data[i]+50; varb=imgdata.data[i+2]+50 //注:当前值大于255时将其赋值255 imgdata.data[i]=r>255?255:r; imgdata.data[i+2]=b>255?255:b; } //将图像信息绘制第二个canvas中,注:一般只能在服务下运行 nowcontext.putImageData(imgdata,0,0); } //青色滤镜 functioncopy10(){ //获取ImageData的属性:width,height,data(包含RGBA四个值); varimgdata=oldcontext.getImageData(0,0,oldcanvas.width,oldcanvas.height); for(vari=0;i<imgdata.data.length;i+=4){ //青色滤镜的算法:绿色通道值和蓝色通道值增加50(绿色+蓝色=青色) varg=imgdata.data[i+1]+50; varb=imgdata.data[i+2]+50 //注:当前值大于255时将其赋值255 imgdata.data[i+1]=g>255?255:g; imgdata.data[i+2]=b>255?255:b; } //将图像信息绘制第二个canvas中,注:一般只能在服务下运行 nowcontext.putImageData(imgdata,0,0); } </script> </body> </html>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。