canvas练习 --------马赛克效果

马赛克效果思路,在画布上选取一个马赛克矩形,从马赛克矩形中随机抽出一个像素点的信息(rgba),将整个马赛克矩形中的像素点信息统一调成随机抽出的那个。

以下的代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			/*清除浏览器的默认样式*/
			*{
				margin: 0;
				padding: 0;
			}
			html,body{
				height: 100%;
				overflow: hidden;
			}
			
			#msk{
				position: absolute;
				left: 50%;
				top: 50%;
				transform: translate3d(-50%,-50%,0);
				background: gray;
			}
		</style>
	</head>
	<body>
		<canvas id="msk" ></canvas>
		
		<script type="text/javascript">
			var canvas = document.querySelector("#msk")
			if(canvas.getContext){
				var ctx =canvas.getContext("2d")
				
				var img =new Image()
				img.src ="../img/1.jpg"
				img.onload = function(){
					//画布的宽为图片的2倍
					canvas.width = img.width*2
					canvas.height = img.height
					draw();
				}
				
		
		
		
		function draw (){
					ctx.drawImage(img,0,0)
					//oldImagedata是获取原画布上的ImageData
					//newImagedata是新建的ImageData
					var oldImgdata = ctx.getImageData(0,0,img.width,img.height)
					var newImgdata = ctx.createImageData(img.width,img.height)			
					
					//马赛克
				/*
				 * 	1.选取一个马赛克矩形
				 * 	2.从马赛克矩形中随机抽出一个像素点的信息(rgba)
				 * 	3.将整个马赛克矩形中的像素点信息统一调成随机抽出的那个
				 */

					var size =5;   //这里设置的马赛克的大小为5
					for(var i=0;i<oldImgdata.width/size;i++){
						for(var j=0;j<oldImgdata.height/size;j++){
							//(i,j)每一个马赛克矩形的坐标
					//Math.random() 随机生成[0,1)的数
						var color = getPxInfo(oldImgdata,i*size+Math.floor((Math.random()*size)),j*size+Math.floor((Math.random()*size)))
						
						for(var a =0;a<size;a++){
							for(var b=0;b<size;b++){
								setPxInfo(newImgdata,i*size+a,j*size+b,color)
							}
							
						}
						}
					}
					ctx.putImageData(newImgdata,img.width,0)
			}
			
			//getPxInfo函数是获取单个像素的颜色
			function getPxInfo(imgdata,x,y){
					var w =imgdata.width
					var h =imgdata.height
					 
					var color = [] ;
					var data =imgdata.data;
					color[0] = data[(y*w+x)*4];
					color[1] = data[(y*w+x)*4+1];
					color[2] = data[(y*w+x)*4+2];
					color[3] = data[(y*w+x)*4+3];
					return color;
				}
				
				//setPxInfo是修改单个像素的颜色
				function setPxInfo(imgdata,x,y,color){
					var w =imgdata.width
					var h =imgdata.height
					 
					var data =imgdata.data;
					 data[(y*w+x)*4] =color[0];
					 data[(y*w+x)*4+1] =color[1];
					 data[(y*w+x)*4+2] =color[2] ;
					 data[(y*w+x)*4+3] = color[3] ;
				}
				}
			
		</script>
	</body>
</html>

假设大的矩形就是画布,每一个小矩形表示一个像素点。有颜色的矩形框表示一个马赛克矩形,将画布分为多个马赛克矩形,然后在马赛克矩形中随机抽取一个像素的颜色,将马赛克矩形中的其他颜色全部换成随机生成的颜色,从而达到了马赛克的效果

效果如下

 

有任何问题请留言,我会给大家解答!!!!!

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值