js canvas画布实现高斯模糊效果


Posted in Javascript onNovember 27, 2018

最近项目中有一个需求是实现图片的局部模糊效果,看上去一个挺难的效果。在实现局部模糊效果前,首先能够实现全部模糊。经过和度娘的一番较劲后,找到了一个不错的案例,然后在他的基础上,经过一番修改,和备注,实现了当前的案例:

js canvas画布实现高斯模糊效果

<!doctype html>
<html lang="zh">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>canvas画布的高斯模糊效果</title>
</head>
<body>
<canvas id="canvas"></canvas>
</body>
<script>
 var canvas = document.getElementById('canvas');
 var ctx = canvas.getContext('2d');
 let img = new Image();
 //这里直接修改图片的路径
 img.src = "636753681750720000/Block/preview.jpg";
 img.onload = function () {
 //设置canvas的宽高
 canvas.height = img.height;
 canvas.width = img.width;
 //将图像绘制到canvas上面
 ctx.drawImage(img, 0, 0, img.width, img.height);
 //从画布获取一半图像
 var data = ctx.getImageData(0, 0, img.width/2, img.height);
 //将图像数据进行高斯模糊 data.data是一个数组,每四个值代表一个像素点的rgba的值,data.width data.height 分别代表图像数据的宽高
 var emptyData = gaussBlur(data);
 //将模糊的图像数据再渲染到画布上面
 ctx.putImageData(emptyData, 0, 0);
 };

 function gaussBlur(imgData) {
 var pixes = imgData.data;
 var width = imgData.width;
 var height = imgData.height;
 var gaussMatrix = [],
  gaussSum = 0,
  x, y,
  r, g, b, a,
  i, j, k, len;

 var radius = 10;
 var sigma = 5;

 a = 1 / (Math.sqrt(2 * Math.PI) * sigma);
 b = -1 / (2 * sigma * sigma);
 //生成高斯矩阵
 for (i = 0, x = -radius; x <= radius; x++, i++) {
  g = a * Math.exp(b * x * x);
  gaussMatrix[i] = g;
  gaussSum += g;

 }

 //归一化, 保证高斯矩阵的值在[0,1]之间
 for (i = 0, len = gaussMatrix.length; i < len; i++) {
  gaussMatrix[i] /= gaussSum;
 }
 //x 方向一维高斯运算
 for (y = 0; y < height; y++) {
  for (x = 0; x < width; x++) {
  r = g = b = a = 0;
  gaussSum = 0;
  for (j = -radius; j <= radius; j++) {
   k = x + j;
   if (k >= 0 && k < width) {//确保 k 没超出 x 的范围
   //r,g,b,a 四个一组
   i = (y * width + k) * 4;
   r += pixes[i] * gaussMatrix[j + radius];
   g += pixes[i + 1] * gaussMatrix[j + radius];
   b += pixes[i + 2] * gaussMatrix[j + radius];
   // a += pixes[i + 3] * gaussMatrix[j];
   gaussSum += gaussMatrix[j + radius];
   }
  }
  i = (y * width + x) * 4;
  // 除以 gaussSum 是为了消除处于边缘的像素, 高斯运算不足的问题
  // console.log(gaussSum)
  pixes[i] = r / gaussSum;
  pixes[i + 1] = g / gaussSum;
  pixes[i + 2] = b / gaussSum;
  // pixes[i + 3] = a ;
  }
 }
 //y 方向一维高斯运算
 for (x = 0; x < width; x++) {
  for (y = 0; y < height; y++) {
  r = g = b = a = 0;
  gaussSum = 0;
  for (j = -radius; j <= radius; j++) {
   k = y + j;
   if (k >= 0 && k < height) {//确保 k 没超出 y 的范围
   i = (k * width + x) * 4;
   r += pixes[i] * gaussMatrix[j + radius];
   g += pixes[i + 1] * gaussMatrix[j + radius];
   b += pixes[i + 2] * gaussMatrix[j + radius];
   // a += pixes[i + 3] * gaussMatrix[j];
   gaussSum += gaussMatrix[j + radius];
   }
  }
  i = (y * width + x) * 4;
  pixes[i] = r / gaussSum;
  pixes[i + 1] = g / gaussSum;
  pixes[i + 2] = b / gaussSum;
  }
 }
 return imgData;
 }
</script>
</html>

代码不多,大家直接copy一下,运行好了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 对象成员的可见性说明
Oct 16 Javascript
JavaScript Sort 表格排序
Oct 31 Javascript
一段批量给页面上的控件赋值js
Jun 19 Javascript
jquery制作居中遮罩层效果分享
Feb 21 Javascript
jquery果冻抖动效果实现方法
Jan 15 Javascript
Javascript实现检测客户端类型代码封包
Dec 03 Javascript
实例详解JavaScript获取链接参数的方法
Jan 01 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
Mar 22 Javascript
js 简易版滚动条实例(适用于移动端H5开发)
Jun 26 Javascript
关于Webpack dev server热加载失败的解决方法
Feb 22 Javascript
使用微信SDK自定义分享的方法
Jul 03 Javascript
解决webpack多页面内存溢出的方法示例
Oct 08 Javascript
video.js 一个页面同时播放多个视频的实例代码
Nov 27 #Javascript
Vue数据双向绑定的深入探究
Nov 27 #Javascript
微信小程序带动画弹窗组件使用方法详解
Nov 27 #Javascript
微信小程序实现日历功能
Nov 27 #Javascript
微信小程序实现打卡日历功能
Sep 21 #Javascript
微信小程序实现时间预约功能
Nov 27 #Javascript
微信小程序使用component自定义toast弹窗效果
Nov 27 #Javascript
You might like
PHPMailer 中文使用说明小结
2010/01/22 PHP
第4章 数据处理-php正则表达式-郑阿奇(续)
2011/07/04 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
图解找出PHP配置文件php.ini的路径的方法
2014/08/20 PHP
JavaScript 拖拉缩放效果
2008/12/10 Javascript
window.print打印指定div实例代码
2013/12/13 Javascript
js类式继承的具体实现方法
2013/12/31 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
JavaScript中的Repaint和Reflow用法详解
2015/07/27 Javascript
JavaScript 模块的循环加载实现方法
2015/12/13 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
React组件的三种写法总结
2017/01/12 Javascript
js canvas实现擦除效果示例代码
2017/04/26 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
[01:00:30]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第二场 10.31
2020/11/02 DOTA
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
python DataFrame 取差集实例
2019/01/30 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
将python安装信息加入注册表的示例
2019/11/20 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
美国Lolё官网:购买大胆而美丽的女性运动服装
2017/05/22 全球购物
新课培训心得体会
2014/09/03 职场文书
食品质检员岗位职责
2015/04/08 职场文书
保留意见审计报告
2015/06/05 职场文书
创业计划书之美甲店
2019/09/20 职场文书