canvas图像处理实现马赛克效果

时间:2021-12-06 17:09:34

  马赛克是我们经常在视频中会见到的,本例通过canvas访问图像像素值并且更改使之呈现成马赛克效果,用以遮挡不想让大家看到的地方(因为是对图像的处理,本地无法看到效果,需要把实例上传到服务器上(本地服务器也可以))。

效果对比图:

canvas图像处理实现马赛克效果canvas图像处理实现马赛克效果

  本例就是利用canvas处理图像像素,获取当前像素的具体位置,然后做一定的处理,看一下代码吧,里面有详尽的注释!

canvas图像处理实现马赛克效果canvas图像处理实现马赛克效果View Code
 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <meta charset="utf-8" />
 5         <title>canvas马赛克</title>
 6     </head>
 7 
 8     <body>
 9         <canvas id='mycanvas'></canvas>
10         <script>
11             var image=new Image();
12             image.src='images/video.jpg';
13             var canvas=document.getElementById('mycanvas');
14             var ctx=canvas.getContext('2d');
15             /*
16              * 需要等到图片加载完毕之后再进行像素处理
17              */
18             image.onload=function (){
19                 //设置画布大小为图像的大小
20                 canvas.width=image.width;
21                 canvas.height=image.height;
22                 ctx.drawImage(image,0,0);//画图
23                 var imagedata=ctx.getImageData(0,0,80,30);//获取需要处理的图像大小
24                 var pixels=imagedata.data;//获取目标图像的所有像素
25                 /*
26                  * 开始规划马赛克区域,设置马赛克区域为3行8列
27                  */
28                 var rows=3;
29                 var cols=8;
30                 //计算每块马赛克的宽和高
31                 var r_wid=imagedata.width/cols;
32                 var c_hei=imagedata.height/rows;
33                 /*
34                  * 开始获取马赛克区域的像素并且设置每个像素的颜色和透明度,
35                  * 第一个for循环遍历每一行的块,第二个for循环遍历每一列的块,
36                  * 第三个和第四个for循环遍历当前块的像素行和像素列
37                  */
38                 for(var r=0;r<rows;r++){
39                     for(var c=0;c<cols;c++){
40                         //设置每块的颜色
41                         var red=Math.round(Math.random()*255);
42                         var green=Math.round(Math.random()*255);
43                         var blue=Math.round(Math.random()*255);
44                         for(var rs=0;rs<r_wid;rs++){
45                             for(var cs=0;cs<c_hei;cs++){
46                                 //X和Y是计算出的真是的像素位置
47                                 var X=(c*r_wid)+cs;
48                                 var Y=(r*c_hei)+rs;
49                                 /*
50                                  * 通过pos=Y*(imagedata.width*4)+(X*4);这个公式用于计算当前像素的第一个值(每个像素由4个值组成:rgba即红绿蓝3个颜色值和透明度,均是由0-255组成),
51                                  * imagedata.width*4计算出所处理图像区域每行的像素总长度,Y是当前像素列,两者相乘就可以获得当前像素所处行的初始值,X*4是当前像素的列位置;
52                                  * 原公式是pos=(Y-1)*(imagedata.width*4)+(X*4);Y-1可以将画布使用的坐标系统转化成像素数组所用的从0开始的坐标系统,由于本例坐标位置就是从0开始计算的,所以Y不用减1
53                                  */
54                                 var pos=Y*(imagedata.width*4)+(X*4);
55                                 pixels[pos]=red;//当前像素的第一个值
56                                 pixels[pos+1]=green;//当前像素的第二个值
57                                 pixels[pos+2]=blue;//当前像素的第三个值
58                                 pixels[pos+3]=255;//当前像素的第四个值
59                             }
60                         }
61                     }
62                 }
63                 ctx.putImageData(imagedata,30,25);//输出像素值
64             }
65             
66         </script>
67     </body>
68 </html>