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 相关文章推荐
通过JavaScript控制字体大小的代码
Oct 04 Javascript
jquery拖动插件(jquery.drag)使用介绍
Jun 18 Javascript
js 获取radio按钮值的实例
Aug 17 Javascript
了不起的node.js读书笔记之mongodb数据库交互
Dec 22 Javascript
详解AngularJS中的依赖注入机制
Jun 17 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
Sep 01 Javascript
js eval函数使用,js对象和字符串互转实例
Mar 06 Javascript
vue修改vue项目运行端口号的方法
Aug 04 Javascript
小程序实现五星点评效果
Nov 03 Javascript
通过滑动翻页效果实现和移动端click事件问题
Jan 26 Javascript
CocosCreator如何实现划过的位置显示纹理
Apr 14 Javascript
JavaScript小技巧带你提升你的代码技能
Sep 15 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 面向对象 PHP5 中的常量
2010/05/05 PHP
队列在编程中的实际应用(php)
2010/09/04 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
2020/03/23 PHP
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
javascript定义函数的方法
2010/12/06 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
JavaScript实现多种排序算法
2016/02/24 Javascript
Node.js的npm包管理器基础使用教程
2016/05/26 Javascript
vue + socket.io实现一个简易聊天室示例代码
2017/03/06 Javascript
js a标签点击事件
2017/03/30 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
JS实现520 表白简单代码
2018/05/21 Javascript
Angular6 正则表达式允许输入部分中文字符
2018/09/10 Javascript
vue自动化路由的实现代码
2019/09/30 Javascript
[48:20]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python显示进度条的方法
2014/09/20 Python
python3 读写文件换行符的方法
2018/04/09 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
python的re模块使用方法详解
2019/07/26 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
什么是python类属性
2020/06/10 Python
python sleep和wait对比总结
2021/02/03 Python
通过一张图教会你CSS3倒影的实现
2017/09/26 HTML / CSS
Intimissimi德国网上商店:意大利知名内衣品牌
2018/04/03 全球购物
儿子婚宴答谢词
2014/01/09 职场文书
运动会广播稿400字
2014/01/25 职场文书
标准毕业生自荐信
2014/06/24 职场文书
群众路线学习心得体会范文
2014/11/05 职场文书
辞职信范文大全
2015/03/02 职场文书
导游词之塘栖古镇
2019/12/04 职场文书
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL