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 相关文章推荐
js 取时间差去掉周六周日实现代码
Dec 25 Javascript
时间戳转换为时间 年月日时间的JS函数
Aug 19 Javascript
node.js中的url.resolve方法使用说明
Dec 10 Javascript
教你使用javascript简单写一个页面模板引擎
May 05 Javascript
javascript实现获取浏览器版本、浏览器类型
Dec 02 Javascript
JavaScript中常用的验证reg
Oct 13 Javascript
微信小程序中子页面向父页面传值实例详解
Mar 20 Javascript
Bootstrap模态框插入视频的实现代码
Jun 25 Javascript
js CSS3实现卡牌旋转切换效果
Jul 04 Javascript
使用JS动态显示文本
Sep 09 Javascript
Vue-cli项目获取本地json文件数据的实例
Mar 07 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
Nov 16 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
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
PHP持久连接mysql_pconnect()函数使用介绍
2012/02/05 PHP
php中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
jQuery文本框(input textare)事件绑定方法教程
2013/04/24 Javascript
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
2014/08/30 Javascript
JavaScript设计模式之单例模式实例
2014/09/24 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
2016/06/14 Javascript
javascript中使用未定义变量或值的情况分析
2016/07/19 Javascript
JS简单随机数生成方法
2016/09/05 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
JavaScript实现数字前补“0”的五种方法示例
2019/01/03 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
JS实现前端动态分页码代码实例
2020/06/02 Javascript
element-ui tree结构实现增删改自定义功能代码
2020/08/31 Javascript
js+canvas实现转盘效果(两个版本)
2020/09/13 Javascript
[38:32]完美世界DOTA2联赛循环赛 Forest vs DM 第二场 11.06
2020/11/06 DOTA
下载糗事百科的内容_python版
2008/12/07 Python
机器学习的框架偏向于Python的13个原因
2017/12/07 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
关于旷工的检讨书
2014/02/02 职场文书
技能比赛获奖感言
2014/02/14 职场文书
学院党的群众路线教育实践活动整改方案
2014/10/04 职场文书
太行山上观后感
2015/06/05 职场文书
毕业酒会致辞
2015/07/29 职场文书
2019邀请函格式及范文
2019/05/20 职场文书