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 相关文章推荐
关于__defineGetter__ 和__defineSetter__的说明
May 12 Javascript
JS如何将UTC格式时间转本地格式
Sep 04 Javascript
一个可以增加和删除行的table并可编辑表格中内容
Jun 16 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
Dec 05 Javascript
很不错的两款Bootstrap Icon图标选择组件
Jan 28 Javascript
Node.js编写组件的三种实现方式
Feb 25 Javascript
Angular实现图片裁剪工具ngImgCrop实践
Aug 17 Javascript
详解angular脏检查原理及伪代码实现
Jun 08 Javascript
javascript实现京东登录显示隐藏密码
Aug 02 Javascript
基于postman获取动态数据过程详解
Sep 08 Javascript
JavaScript实现商品评价五星好评
Nov 30 Javascript
通过vue.extend实现消息提示弹框的方法记录
Jan 07 Vue.js
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 单引号与双引号的区别
2009/11/24 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
jQuery技巧总结
2011/01/01 Javascript
统计jQuery中各字符串出现次数的工具
2012/05/03 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
node.js中的favicon.ico请求问题处理
2014/12/15 Javascript
jQuery中next方法用法实例
2015/04/24 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
js实现全国省份城市级联下拉菜单效果代码
2015/09/07 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
2018/09/07 Javascript
Vue实现日历小插件
2019/06/26 Javascript
使用PYTHON创建XML文档
2012/03/01 Python
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
详解Django框架中的视图级缓存
2015/07/23 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
酒店拾金不昧表扬信
2014/01/18 职场文书
没有孩子的离婚协议书怎么写
2014/09/17 职场文书
2014年质检员工作总结
2014/11/18 职场文书
幼儿园六一儿童节演讲稿
2015/03/19 职场文书
学雷锋团日活动总结
2015/05/06 职场文书
小学语文新课改心得体会
2016/01/22 职场文书
javascript canvas实现雨滴效果
2021/06/09 Javascript
MYSQL常用函数介绍
2022/05/05 MySQL
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android