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 相关文章推荐
制作特殊字的脚本
Jun 26 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
Jun 23 Javascript
JQuery循环滚动图片代码
Dec 08 Javascript
js获取电脑分辨率的思路及操作
Nov 22 Javascript
jQuery源码解读之removeClass()方法分析
Feb 20 Javascript
js实现图片轮播效果学习笔记
Jul 26 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
Aug 09 Javascript
vue-router懒加载速度缓慢问题及解决方法
Nov 25 Javascript
细述Javascript的加法运算符的具体使用
Oct 18 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
Nov 01 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
Dec 19 Javascript
js实现点赞按钮功能的实例代码
Mar 06 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
检查url链接是否已经有参数的php代码 添加 ? 或 &amp;
2010/02/09 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
jQuery实现进度条效果代码
2015/12/17 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
jQuery访问浏览器本地存储cookie、localStorage和sessionStorage的基本用法
2017/10/20 jQuery
浅谈vue中.vue文件解析流程
2018/04/24 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
python之yield表达式学习
2014/09/02 Python
简洁的十分钟Python入门教程
2015/04/03 Python
python redis 删除key脚本的实例
2019/02/19 Python
更新pip3与pyttsx3文字语音转换的实现方法
2019/08/08 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
乌克兰设计师和品牌的服装:Love&Live
2020/04/14 全球购物
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
幼儿园中班下学期评语
2014/04/18 职场文书
会计电算化专业求职信
2014/06/10 职场文书
公司门卫工作职责
2014/06/28 职场文书
领导班子遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
运输公司工作总结
2015/08/11 职场文书
python热力图实现的完整实例
2022/06/25 Python