• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

黄文超

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

用canvas自定义马赛克

用canvas自定义马赛克

使用自定义方法制作马赛克

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>马赛克</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        html,body {
            height: 100%;
            width: 100%;
            overflow: hidden;
        }
        #test {
            background-color: pink;
        }
    </style>
</head>
<body>
<canvas id="test"></canvas>
</body>
<script>
    var test = document.getElementById("test")
    test.height = document.documentElement.clientHeight
    test.width = document.documentElement.clientWidth
    var ctx = test.getContext('2d')
    var img = new Image()
    img.src = "test.jpg"
    getMosaic(ctx,img,0,0)
    /*
    * ctx 画布对象
    * img 图片对象
    * 马赛克位置x,y
    * size 马赛克大小
    * */
    function getMosaic(ctx,img,x,y,size=4) {
        img.onload = function() {
            ctx.drawImage(img,0,0)
            var oldImg = ctx.getImageData(0,0,img.width,img.height)
            //设置1个马赛克大小
            var newImg = ctx.createImageData(oldImg.width,oldImg.height)
            for (var mh=0;mh<img.height/size;mh++) {
                for (var mw=0;mw<img.width/size;mw++) {
                    // 获取像素
                    var color = getPxInfo(oldImg,mw*size + Math.floor(Math.random()*size),mh*size+Math.floor(Math.random()*size))
                    // 给新图片设置像素
                    for (var a=0;a<size;a++) {
                        for (var b=0;b<size;b++) {
                            setPxInfo(newImg,mw*size+a,mh*size+b,color)
                        }
                    }
                }
            }
            ctx.putImageData(newImg,x,y)
        }
    }

    /*
    * 获取当前像素颜色
    * */
    function getPxInfo(imageData,x,y) {
        var color = []
        color[0] = imageData.data[(y*imageData.width + x)*4]
        color[1] = imageData.data[(y*imageData.width + x)*4 + 1]
        color[2] = imageData.data[(y*imageData.width + x)*4 + 2]
        color[3] = imageData.data[(y*imageData.width + x)*4 + 3]
        return color
    }

    /*
    * 获取当前imageData对象中的x,y的颜色
    * */
    function setPxInfo(imageData,x,y,color) {
        imageData.data[(y*imageData.width + x)*4] = color[0]
        imageData.data[(y*imageData.width + x)*4 + 1] = color[1]
        imageData.data[(y*imageData.width + x)*4 + 2] = color[2]
        imageData.data[(y*imageData.width + x)*4 + 3] = color[3]
        return imageData
    }
</script>
</html>

posted on 2021-11-10 10:29  黄文超  阅读(133)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3