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 相关文章推荐
ExtJS 2.2.1的grid控件在ie6中的显示问题
May 04 Javascript
验证控件与Button的OnClientClick事件详细解析
Dec 04 Javascript
js判断页面中是否有指定控件的简单实例
Mar 04 Javascript
node.js实现端口转发
Apr 14 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
Jun 01 Javascript
jQuery EasyUi 验证功能实例解析
Jan 06 Javascript
Angular2实现组件交互的方法分析
Dec 19 Javascript
动态加载权限管理模块中的Vue组件
Jan 16 Javascript
jQuery实现左右滑动的toggle方法
Mar 03 jQuery
微信小程序自定义导航栏实例代码
Apr 05 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
Apr 10 Javascript
Typescript的三种运行方式(小结)
Sep 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中HTTP方式下的Gzip压缩传输方法举偶
2007/02/15 PHP
Jquery 数组操作大全个人总结
2013/11/13 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
jquery原理以及学习技巧介绍
2015/11/11 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
详解如何使用webpack+es6开发angular1.x
2017/08/16 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
Three.JS实现三维场景
2018/12/30 Javascript
js计算两个时间差 天 时 分 秒 毫秒的代码
2019/05/21 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
基于JavaScript实现简单扫雷游戏
2021/01/02 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
Python调用C语言开发的共享库方法实例
2015/03/18 Python
利用pyinstaller或virtualenv将python程序打包详解
2017/03/22 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
利用Pandas 创建空的DataFrame方法
2018/04/08 Python
python把数组中的数字每行打印3个并保存在文档中的方法
2018/07/17 Python
Python之inspect模块实现获取加载模块路径的方法
2018/10/16 Python
Python中的heapq模块源码详析
2019/01/08 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
Django处理Ajax发送的Get请求代码详解
2019/07/29 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
外语专业毕业生个人的自荐信
2013/11/19 职场文书
学校大课间活动方案
2014/01/30 职场文书
城管综合整治方案
2014/05/01 职场文书
运动会口号8字
2014/06/07 职场文书
供电工程专业求职信
2014/08/09 职场文书
高考学习决心书
2015/02/04 职场文书
英雄儿女观后感
2015/06/09 职场文书