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 tab 选项卡
Apr 26 Javascript
js页面跳转的常用方法整理
Oct 18 Javascript
JavaScript中Math对象方法使用概述
Jan 02 Javascript
Linux下使用jq友好的打印JSON技巧分享
Nov 18 Javascript
AngularJS基础教程之简单介绍
Sep 27 Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 Javascript
前端框架Vue.js构建大型应用浅析
Sep 12 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
Dec 19 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
Mar 15 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
Apr 28 jQuery
JavaScript函数式编程(Functional Programming)纯函数用法分析
May 22 Javascript
Vue2项目中对百度地图的封装使用详解
Jun 16 Vue.js
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 URL验证正则表达式
2011/07/19 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
IE 下的只读 innerHTML
2009/08/21 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
jquery ztree实现下拉树形框使用到了json数据
2014/05/14 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
2016/01/23 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
Bootstrap Table使用整理(五)之分页组合查询
2017/06/09 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
2017/09/17 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
Vue slot用法(小结)
2018/10/22 Javascript
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
Python实现去除代码前行号的方法
2015/03/10 Python
python实现按行切分文本文件的方法
2016/04/18 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
Python使用asyncio包处理并发详解
2017/09/09 Python
Python类super()及私有属性原理解析
2020/06/15 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
医院护理人员的自我评价分享
2013/10/04 职场文书
区三好学生主要事迹
2014/01/30 职场文书
军训鉴定表自我鉴定
2014/02/13 职场文书
机关作风建设自查报告
2014/10/22 职场文书
预备党员介绍人意见
2015/06/01 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
jQuery实现广告显示和隐藏动画
2021/07/04 jQuery
Node与Python 双向通信的实现代码
2021/07/16 Javascript