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 相关文章推荐
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
Nov 23 Javascript
input+select(multiple) 实现下拉框输入值
May 21 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
Jan 16 Javascript
js函数获取html中className所在的内容并去除标签
Sep 08 Javascript
jquery $.each()使用探讨
Sep 23 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
Apr 05 Javascript
JQuery插入DOM节点的方法
Jun 11 Javascript
BootStrap实用代码片段之一
Mar 22 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
Mar 30 Javascript
Vue父子模版传值及组件传值的三种方法
Nov 27 Javascript
javascript防抖函数debounce详解
Jun 11 Javascript
vue Element左侧无限级菜单实现
Jun 10 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
PHP不用递归实现无限分级的例子分享
2014/04/18 PHP
php获取数组元素中头一个数组元素值的实现方法
2014/12/20 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
仿163填写邮件地址自动显示下拉(无优化)
2008/11/05 Javascript
从父页面读取和操作iframe中内容方法
2009/07/25 Javascript
js 动态选中下拉框
2009/11/26 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
JS弹出层的显示与隐藏示例代码
2013/12/27 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
js querySelector() 使用方法
2016/12/21 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
2017/09/07 jQuery
Angular实现预加载延迟模块的示例
2017/10/12 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
2019/10/17 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
python redis 删除key脚本的实例
2019/02/19 Python
python获取array中指定元素的示例
2019/11/26 Python
python创建n行m列数组示例
2019/12/02 Python
Python多线程正确用法实例解析
2020/05/30 Python
为什么说python适合写爬虫
2020/06/11 Python
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
美国尼曼百货官网:Neiman Marcus
2019/09/05 全球购物
日本语毕业生自荐信
2014/02/01 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
期末复习计划
2015/01/19 职场文书
万能检讨书
2015/01/27 职场文书
社团个人总结范文
2015/03/05 职场文书
小英雄雨来观后感
2015/06/09 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书