• canvas_画出图片的马赛克


    一、效果如下图所示

     二、实现

    1、实现思路

          第一步:选取一个小的矩形形状作为马赛克矩形

          第二步:在小的马赛克矩形中随机选取一个像素点,

          第三步:将小矩形中的其他地方都填充成这个像素点的颜色

    2、如图所示选取一个5*5像素的矩形作为马赛克小矩形,小马赛克矩形与像素矩形有如下所示的对应关系

    3、

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</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-color: gray;
            }
    
        </style>
    </head>
    <body>
        <canvas id="msk" ></canvas>
        <script type="text/javascript">
            window.onload = function(){
                var oc = document.querySelector("#msk")
                if(oc.getContext){
                    var ctx = oc.getContext('2d')
                    var img = new Image()
    
                    img.src="tg.png"
                    img.onload = function(){
                        oc.width = img.width*2
                        oc.height = img.height
                        draw()
    
                    }
    
                    function draw(){
                        ctx.drawImage(img,0,0); 
                        var oldImgdata = ctx.getImageData(0,0,img.width,img.height) //之前的图片
                        var newImgdata = ctx.createImageData(img.width, img.height) //马赛克后的图片
    
                        var size = 5 //设置的马赛克小矩形尺寸为5个像素
                        for(var i=0; i<oldImgdata.width/size;i++){ //横排的马赛克矩形的数目
                            for(var j=0; j<oldImgdata.height/size;j++){ //竖列的马赛克数目
                                //(i,j)
                                //(0,0):(0,0)-(4,4)
                                //(1,0):(5,0)-(9,4)
                                //(0,1):(0,5)-(4,9)
                                //(1,1):(5,5) (9,9)
                                //这里是从小马赛克矩形中选出来的一个像素点的颜色
                                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.clearRect(0,0,oc.width,oc.height);
                            ctx.putImageData(newImgdata,0,0);
                        }
    
                        function getPxInfo(imgdata,x,y){
                        var color = [];
                        var data = imgdata.data;
                        var w = imgdata.width;
                        var h = imgdata.height;
                        
                        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;
                    }
                    
                    function setPxInfo(imgdata,x,y,color){
                        var data = imgdata.data;
                        var w = imgdata.width;
                        var h = imgdata.height;
                        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>
  • 相关阅读:
    Vue监听器、过滤器
    Vue生命周期、计算属性
    数组去重
    ES6总结
    学习笔记--html篇(1)
    学习整理--flex布局(1)
    对块作用域与变量函数提升再添新认识
    了解使用web workers
    js中的事件循环模型与特殊的定时器
    操作系统、浏览器与js之间的一些概念与联系
  • 原文地址:https://www.cnblogs.com/xxm980617/p/11623340.html
Copyright © 2020-2023  润新知