JS实现马赛克图片效果完整示例


Posted in Javascript onApril 13, 2019

本文实例讲述了JS实现马赛克图片效果。分享给大家供大家参考,具体如下:

整体逻辑:获取oldImg图片的像素信息,以5*5为单位,在5*5单位中取到一个随机像素并赋值给5*5中的所有像素点,加以循环,以实现马赛克效果。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>3water.com JS图片马赛克</title>
    <style type="text/css">
      * {
        margin: 0;
        padding: 0;
      }
      body {
        background-color: grey;
        text-align: center;
      }
      #myCanvas {
        background-color: rgba(250, 0, 0, 0.3);
      }
    </style>
  </head>
  <body>
    <canvas id="myCanvas" width="500" height="400"></canvas>
  </body>
  <script type="text/javascript">
    window.onload = function() {
      var myCanvas = document.getElementById('myCanvas');
      var painting = myCanvas.getContext('2d');
       //生成一个图片节点
      var imgNode = new Image();
      imgNode.src = '1.jpg';
      //调用函数
      drawImg(imgNode);
      function drawImg(imgNode) {
        //图片加载后执行马赛克实现语句:5个一组取到随机像素赋给新图里的五个一组
        imgNode.onload = function() {
          painting.drawImage(imgNode, 0, 0, 250, 400);
          var size = 5;
          //获取老图所有像素点
          var oldImg = painting.getImageData(0, 0, 250, 400)
          //创建新图像素对象
          var newImg = painting.createImageData(250, 400)
          for(var i = 0; i < oldImg.width; i++) {
            for(var j = 0; j < oldImg.height; j++) {
              //从5*5中获取单个像素信息
              var color = getPxInfo(oldImg, Math.floor(i * size + Math.random() * size), Math.floor(j * size + Math.random() * size))
              //写入单个像素信息
              for(var a = 0; a < size; a++) {
                for(var b = 0; b < size; b++) {
                  //              (a,b)
                  setPxInfo(newImg, i * size + a, j * size + b, color);
                }
              }
            }
          }
          painting.putImageData(newImg, 250, 0)
        }
      }
      //读取单个像素信息
      function getPxInfo(imgDate, x, y) {
        var colorArr = [];
        var width = imgDate.width;
        colorArr[0] = imgDate.data[(width * y + x) * 4 + 0]
        colorArr[1] = imgDate.data[(width * y + x) * 4 + 1]
        colorArr[2] = imgDate.data[(width * y + x) * 4 + 2]
        colorArr[3] = imgDate.data[(width * y + x) * 4 + 3]
        return colorArr;
      }
      //写入单个像素信息
      function setPxInfo(imgDate, x, y, colors) {
        //(x,y) 之前有多少个像素点 == width*y + x
        var width = imgDate.width;
        imgDate.data[(width * y + x) * 4 + 0] = colors[0];
        imgDate.data[(width * y + x) * 4 + 1] = colors[1];
        imgDate.data[(width * y + x) * 4 + 2] = colors[2];
        imgDate.data[(width * y + x) * 4 + 3] = colors[3];
      }
    }
  </script>
</html>

更多关于JavaScript相关内容还可查看本站专题:《JavaScript+HTML5特效与技巧汇总》、《JavaScript图形绘制技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jquery实现漂浮在网页右侧的qq在线客服插件示例
May 13 Javascript
JS解决ie6下png透明的方法实例
Aug 02 Javascript
动态加载JS文件的三种方法
Nov 08 Javascript
JavaScript中exec函数用法实例分析
Jun 08 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
Aug 24 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
Oct 31 Javascript
JS动态加载脚本并执行回调操作
Aug 24 Javascript
jQuery快速实现商品数量加减的方法
Feb 06 Javascript
微信小程序日历/日期选择插件使用方法详解
Dec 28 Javascript
Javascript通过控制类名更改样式
May 24 Javascript
在vue项目实现一个ctrl+f的搜索功能
Feb 28 Javascript
对vuex中store和$store的区别说明
Jul 24 Javascript
ES6入门教程之let、const的使用方法
Apr 13 #Javascript
ES6入门教程之变量的解构赋值详解
Apr 13 #Javascript
微信小程序template模版的使用方法
Apr 13 #Javascript
vue基于viewer实现的图片查看器功能
Apr 12 #Javascript
js form表单input框限制20个字符,10个汉字代码实例
Apr 12 #Javascript
详解js创建对象的几种方法及继承
Apr 12 #Javascript
详解JQuery基础动画操作
Apr 12 #jQuery
You might like
PHP中使用数组指针函数操作数组示例
2014/11/19 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
2015/01/26 PHP
在Nginx上部署ThinkPHP项目教程
2015/02/02 PHP
JS 事件绑定函数代码
2010/04/28 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
2015/08/28 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
ES6新数据结构Set与WeakSet用法分析
2017/03/31 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
python使用paramiko模块实现ssh远程登陆上传文件并执行
2014/01/27 Python
简介Django中内置的一些中间件
2015/07/24 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
Python线程创建和终止实例代码
2018/01/20 Python
python基础教程项目五之虚拟茶话会
2018/04/02 Python
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
超实用的 30 段 Python 案例
2019/10/10 Python
python 实现按对象传值
2019/12/26 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
2020/02/29 Python
一文读懂Python 枚举
2020/08/25 Python
canvas使用注意点总结
2013/07/19 HTML / CSS
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
湖南卫视在线视频媒体平台:芒果TV
2019/10/30 全球购物
中专毕业生求职简历的自我评价
2013/10/21 职场文书
我的网上商城创业计划书
2013/12/26 职场文书
毕业生求职自荐信怎么写
2014/01/08 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
2014年教师节红领巾广播稿
2014/09/10 职场文书
四风问题民主生活会对照检查材料思想汇报
2014/09/27 职场文书
清明节扫墓活动总结
2015/02/09 职场文书
闪闪红星观后感
2015/06/08 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis