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 相关文章推荐
php图像生成函数之间的区别分析
Dec 06 Javascript
在父页面调用子页面的JS方法
Sep 29 Javascript
js导航栏单击事件背景变换示例代码
Jan 13 Javascript
bootstrap fileinput 上传插件的基础使用
Feb 17 Javascript
ES6新数据结构Set与WeakSet用法分析
Mar 31 Javascript
Angular 5.0 来了! 有这些大变化
Nov 15 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
Mar 13 Javascript
详解使用create-react-app添加css modules、sasss和antd
Jul 31 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
May 22 Javascript
JS数组的常用10种方法详解
May 08 Javascript
JavaScript判断数据类型有几种方法及区别介绍
Sep 02 Javascript
Vue3中toRef与toRefs的区别
Mar 24 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修改时间格式的代码
2011/05/29 PHP
php中Smarty模板初体验
2011/08/08 PHP
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
js模态对话框使用方法详解
2017/02/16 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
vue element table中自定义一些input的验证操作
2020/07/18 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
Python递归函数定义与用法示例
2017/06/02 Python
Python 将RGB图像转换为Pytho灰度图像的实例
2017/11/14 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
Python基于OpenCV实现人脸检测并保存
2019/07/23 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
2019/09/23 Python
django实现模型字段动态choice的操作
2020/04/01 Python
Python decorator拦截器代码实例解析
2020/04/04 Python
CSS3中几个新增加的盒模型属性使用教程
2016/03/01 HTML / CSS
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
高中毕业生自我鉴定
2013/11/03 职场文书
求职信的要素有哪些呢
2013/12/26 职场文书
学生自我鉴定模板
2013/12/30 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
入党现实表现材料
2014/12/23 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
导游词之无锡古运河
2019/11/14 职场文书