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 相关文章推荐
分享14个很酷的jQuery导航菜单插件
Apr 25 Javascript
JS图片无缝滚动(简单利于使用)
Jun 17 Javascript
JavaScript学习笔记之JS函数
Jan 22 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
Dec 16 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
Jan 04 Javascript
Vue.JS入门教程之处理表单
Dec 01 Javascript
简单实现js上传文件功能
Aug 21 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
Aug 30 Javascript
详解如何让Express支持async/await
Oct 09 Javascript
Vue实现动态创建和删除数据的方法
Mar 17 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
Apr 07 Javascript
html实现随机点名器的示例代码
Apr 02 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 八种基本的数据类型小结
2011/06/01 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
javascript中的array数组使用技巧
2010/01/31 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
2016/06/20 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
深入浅析search 搜索框的写法
2016/08/02 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
详解webpack babel的配置
2018/01/09 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
Python MD5文件生成码
2009/01/12 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
python如何读写csv数据
2018/03/21 Python
Python模块的加载讲解
2019/01/15 Python
python实现PID算法及测试的例子
2019/08/08 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
关于Python解包知识点总结
2020/05/05 Python
Python调用C/C++的方法解析
2020/08/05 Python
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
体育教育个人自荐信范文
2013/12/01 职场文书
安全施工标语
2014/06/07 职场文书
绿里奇迹观后感
2015/06/15 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang