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 相关文章推荐
JavaScipt基本教程之JavaScript语言的基础
Jan 16 Javascript
jQuery无刷新分页完整实例代码
Oct 27 Javascript
实例讲解js验证表单项是否为空的方法
Jan 09 Javascript
jQuery实现的自适应焦点图效果完整实例
Aug 24 Javascript
BootStrap便签页的简单应用
Jan 06 Javascript
基于vue2.0+vuex的日期选择组件功能实现
Mar 13 Javascript
jquery实现一个全局计时器(商城可用)
Jun 30 jQuery
基于Vuejs和Element的注册插件的编写方法
Jul 03 Javascript
angular4 JavaScript内存溢出问题
Mar 06 Javascript
详解IOS微信上Vue单页面应用JSSDK签名失败解决方案
Nov 14 Javascript
世界上最短的数字判断js代码
Sep 09 Javascript
微信小程序之高德地图多点路线规划过程示例详解
Jan 18 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求最大子序列和的算法实现
2011/06/24 PHP
php中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
php使用curl访问https示例分享
2014/01/17 PHP
Symfony页面的基本创建实例详解
2015/01/26 PHP
php实现图片局部打马赛克的方法
2015/02/11 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
2017/04/03 PHP
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
2015/03/12 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
深入浅析同源策略和跨域访问
2015/11/26 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
vue component组件使用方法详解
2017/07/14 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
2020/11/04 Javascript
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python 简易计算器程序,代码就几行
2009/08/29 Python
Python使用新浪微博API发送微博的例子
2014/04/10 Python
Python实现控制台进度条功能
2016/01/04 Python
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
Python异常处理机制结构实例解析
2020/07/23 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
python中操作文件的模块的方法总结
2021/02/04 Python
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
高中微机老师自我鉴定
2014/02/16 职场文书
数字化校园建设方案
2014/05/03 职场文书
股票投资建议书
2014/05/19 职场文书
机械操作工岗位职责
2014/08/08 职场文书
房地产营销活动策划方案
2014/09/15 职场文书
科技活动周标语
2014/10/08 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
2014年学校工会工作总结
2014/12/06 职场文书
销区经理年终述职报告模板
2019/11/28 职场文书