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事件的连接使用示例
Jun 18 Javascript
js获取url中指定参数值的示例代码
Dec 14 Javascript
js 跳出页面的frameset框架示例介绍
Dec 23 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
Jun 09 Javascript
AngularJS的表单使用详解
Jun 17 Javascript
学习JavaScript设计模式之状态模式
Jan 08 Javascript
jQuery插件pagination实现无刷新分页
May 21 Javascript
ES6学习笔记之正则表达式和字符串正则方法分析
Apr 25 Javascript
JS触摸与手势事件详解
May 09 Javascript
Vue常用的几个指令附完整案例
Nov 06 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
Jul 19 Javascript
关于Node.js中频繁修改代码重启服务器的问题
Oct 15 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
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
php selectradio和checkbox默认选择的实现方法详解
2013/06/29 PHP
ThinkPHP中的常用查询语言汇总
2014/08/22 PHP
PHP生成不重复随机数的方法汇总
2014/11/19 PHP
PHP单链表的实现代码
2016/07/05 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
Discuz不使用插件实现简单的打赏功能
2019/03/21 PHP
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
详解react内联样式使用webpack将px转rem
2018/09/13 Javascript
vue+axios+promise实际开发用法详解
2018/10/15 Javascript
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
python字符串str和字节数组相互转化方法
2017/03/18 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
python3爬虫学习之数据存储txt的案例详解
2019/04/24 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
python输入错误后删除的方法
2019/10/12 Python
Python enumerate内置库用法解析
2020/02/24 Python
python 深度学习中的4种激活函数
2020/09/18 Python
Python实现王者荣耀自动刷金币的完整步骤
2021/01/22 Python
妈妈的账单教学反思
2014/02/06 职场文书
个人自我鉴定总结
2014/03/25 职场文书
实习单位推荐信
2015/03/27 职场文书
学校运动会简讯
2015/07/20 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
Python基础详解之邮件处理
2021/04/28 Python