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 分号引起的一段调试问题
Jun 18 Javascript
jquery-easyui关闭tab自动切换到前一个tab
Jul 29 Javascript
解决jquery的.animate()函数在IE6下的问题
Dec 03 Javascript
基于jquery的button默认enter事件(回车事件)。
May 18 Javascript
javascript 动态创建表格的2种方法总结
Mar 04 Javascript
jquery+ajax实现直接提交表单实例分析
Jun 17 Javascript
js实现的简练高效拖拽功能示例
Dec 21 Javascript
微信小程序 Tab页切换更新数据
Jan 05 Javascript
javascript实现秒表计时器的制作方法
Feb 16 Javascript
解决Jquery下拉框数据动态获取的问题
Jan 25 jQuery
js中call()和apply()改变指针问题的讲解
Jan 17 Javascript
vue获取form表单的值示例
Oct 29 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数据采集的详解
2013/06/02 PHP
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
2016/02/25 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
AngularJS API之copy深拷贝详解及实例
2016/09/14 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
express 项目分层实践详解
2018/12/10 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
python爬虫入门教程之点点美女图片爬虫代码分享
2014/09/02 Python
Python对字符串实现去重操作的方法示例
2017/08/11 Python
python+pyqt实现右下角弹出框
2017/10/26 Python
python3学生名片管理v2.0版
2018/11/29 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
2020/04/16 Python
css3实现书本翻页效果的示例代码
2021/03/08 HTML / CSS
英国医生在线预约:Top Doctors
2019/10/30 全球购物
毕业实习个人鉴定范文
2013/12/10 职场文书
幼儿园春游活动方案
2014/01/19 职场文书
数控个人求职信范文
2014/02/03 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
刑事附带民事代理词
2015/05/25 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书
学术会议开幕词
2016/03/03 职场文书
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python