[canvas入坑2]模糊效果

查看效果请到 http://philippica.github.io/  点击blur

模糊效果比较好的应该是高斯模糊,一个点的值变成了以该点为圆心的一个圆内所有像素的加权平均,权重由二维正态分布计算出

以前用qt实现过一个高斯模糊,但是js的速度毕竟不能和c++比,为了实现一个比较好的效果,这里在效率和效果方面做了个折中,每一点的值等于以这个点为中心的正方形内所有像素值的平均

这样的优点是计算速度快,矩阵天然的存着正方形,所以通过一个O(canvasWidth * canvasHeight)的预处理,接下来即可迅速地得到每个像素的值

具体方法应该是acm里用烂的方法,sum[i][j]存着以(i,j)为右下角的到左上角画布中所有该通道值的和,于是画布中任意矩形的和都可以用一个类似容斥的方法O(1)得到

预处理的代码:

 1     var ppImgData = context.getImageData(0, 0, ppCanvasWidth, ppCanvasHeight);
 2     var ppData = ppImgData.data;
 3     var ppTemp = ppData;
 4     var radius = 0;
 5     var length = ppData.length;
 6     $(‘#range‘).attr("value", 0);
 7     for(var i = 0; i < ppCanvasHeight; i++)
 8     {
 9         for(var j = 0; j < ppCanvasWidth; j++)
10         {
11             var position = i * ppCanvasWidth + j;
12             var x = (position) * 4;
13             sumR[position] = ppData[x];
14             sumG[position] = ppData[x + 1];
15             sumB[position] = ppData[x + 2];
16             if(i != 0)
17             {
18                 sumR[position] += sumR[position - ppCanvasWidth];
19                 sumG[position] += sumG[position - ppCanvasWidth];
20                 sumB[position] += sumB[position - ppCanvasWidth];
21             }
22             if(j != 0)
23             {
24                 sumR[position] += sumR[position - 1];
25                 sumG[position] += sumG[position - 1];
26                 sumB[position] += sumB[position - 1];
27             }
28             if(i != 0 && j != 0)
29             {
30                 sumR[position] -= sumR[position - ppCanvasWidth - 1];
31                 sumG[position] -= sumG[position - ppCanvasWidth - 1];
32                 sumB[position] -= sumB[position - ppCanvasWidth - 1];
33             }
34         }
35     }

sumR sumG sumB分别存着三个通道内的预处理的值,radius表示模糊半径

具体计算模糊的代码:

 1     function ppBlur()
 2     {
 3         var area = (radius + radius + 1) * (radius + radius + 1);
 4         for(var i = 0; i < ppCanvasHeight; i++)
 5         {
 6             for(var j = 0; j < ppCanvasWidth; j++)
 7             {
 8                 var position = i * ppCanvasWidth + j;
 9                 var x = (position) * 4;
10                 var tt = (i + radius) * ppCanvasWidth + j + radius;
11                 var tt2 = (i - radius - 1) * ppCanvasWidth + j + radius;
12                 var tt3 = (i + radius) * ppCanvasWidth + j - radius - 1;
13                 var tt4 = (i - radius - 1) * ppCanvasWidth + j - radius - 1;
14                 ppTemp[x] = (sumR[tt] - sumR[tt2] - sumR[tt3] + sumR[tt4]) / area;
15                 ppTemp[x + 1] = (sumG[tt] - sumG[tt2] - sumG[tt3] + sumG[tt4]) / area;
16                 ppTemp[x + 2] = (sumB[tt] - sumB[tt2] - sumB[tt3] + sumB[tt4]) / area;
17             }
18         }
19         ppData = ppTemp;
20         context.putImageData(ppImgData, 0, 0);
21     }
sumR[tt] - sumR[tt2] - sumR[tt3] + sumR[tt4]就是容斥出该正方形内R通道的和,再除以该区域内像素的总数即是平均值

总结:边界处理不好,在图片的边缘会明显变暗,主要是在边界处area的发生了变化
时间: 2024-10-13 14:29:18

[canvas入坑2]模糊效果的相关文章

[canvas入坑3] 类似ps中魔术棒或者画图中油漆桶的功能

查看效果请到 http://philippica.github.io/  点击fill 这功能其实实现很low,最早高一看黑书的时候看到了floodfill算法感觉好神奇,转念一想这不就是bfs么!!被高大上名词骗了有木有 所以先设置一个阈值var threshold;它的含义和photoshop魔术棒中容差的含义相同,当它等于0时表现出来的功能就是画图的油漆桶 然后进行bfs,从鼠标按下的点开始做 唔,js里面shift unshift pop push这四个Array上的函数天然的让queu

web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】

http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,JS前端实用开发QQ群 :147250970 欢迎加入~! 目录(?)[+] hi,大家好! 我的第一篇文章:[web前端到底是什么?有前途吗?],在我没想到如此 ‘HOT’ 的情况下 得到很多好评和有效传播. 也为我近期新开的 个人前端公众号:前端你别闹(webunao) 直接增加了几百粉(果然,帅

弃坑pexpect,入坑paramiko

弃坑pexpect,入坑paramiko 上文书说到,ssh库pexpect的使用,简直就是个"月亮公主"--满眼全是坑.勉强把程序写好了,跑起来的时候发现了一个新坑,让我不可抗拒的把它弃掉了--经常莫名其妙的连不上服务器!开线程连接14台服务器,总有1到3台连不上,还查不到原因.这还了得!一怒之下把写好的pexpect封装库删掉了,用paramiko重新写起.其实这个库也是有一些坑的,这个放在后面说.先介绍一下这个库的用法. 安装方法:没有什么新鲜的 pip install para

py3学习笔记0(入坑)

什么是Python? Python是一种面向对象.解释型计算机程序设计语言,语法简洁,具有很多强大的库.它也被称为胶水语言,能够把其他语言制作的库轻松地粘合在一起.现常用于科学计算,界面设计,网络通信等. 它优雅,明确,简单,将“用一种方法,最好是只有一种方法来做一件事”的优雅哲学贯穿始终. 当然关键还是它比较好玩,就抱着玩一玩的心态入坑看看咯. 初期学的是py2,主要写写小游戏,爬虫什么的. 在学校很久没有编程了,平时还是要写写代码练练手. 那就开始学py3吧!虽然都差不多,但周围有好多人都想

ReactNative for Android入坑(一)

最近找工作发现有些公司要求会ReactNative,决定入坑. 搭建环境:官网详细的教程附链接. 坑一:FQ,建议整个搭建过程中FQ.第一步:安装Chocolatey,管理员运行cmd,输入指令: Chocolatey安装官网指令:@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org

VPS 入坑之路

一.入坑动机: 以前一直的FQ服务也被请喝茶了,仅限企业客户使用.于是想到租用一个VPS,搭个梯子. 二.入坑之路: 1.购买 想起在G+看见有人推荐搬瓦工性价比很高,去了解了一下,最低配置19.99刀一年,折合人民币也就十块一个月的样子,果断入之. 2.SS 以前在虚拟机稍微接触过linux,比如ubuntu和fedora,然而都是在图形界面瞎搞.这次终于有机会在终端操作了.各种命令上手确实不容易,只会cd,ls...突然发现控制面板有一键搭建SS,后来又放弃了敲命令...有一天心血来潮,决定

猿说摄影(上)--入坑指南

最近师弟师妹们以及复读的童鞋临近毕业,有的想买相机拍拍毕业照,记录一下旅行毕业游之类的.五一放假,咱就先不聊技术,聊一下摄影,不过摄影也是一个技术活,而且烧钱.摄影穷三代,单反毁一生.相机贵吗?贵,但贵的不只是相机,还有镜头.为什么这么说呢?大家也知道,单反和微单都是可以更换镜头的.一旦入坑,除了买相机同时买的套头(标准变焦镜头)之外,你很可能会接下来陆陆续续地买其它镜头→_→想拍漂亮的人物,你需要大光圈的定焦镜头:想拍壮阔的风景,你需要广角镜头:想拍飞禽走兽,你需要长焦镜头:你可能还要拍点小花

webpack入坑之旅(一)不是开始的开始

最近学习框架,选择了vue,然后接触到了vue中的单文件组件,官方推荐使用 Webpack + vue-loader构建这些单文件 Vue 组件,于是就开始了webpack的入坑之旅.因为原来没有用过任何的构建工具与模块化工具,所以本系列会十分的基础.并且可能有很多不正确的地方,希望大家谅解,并指出错误帮助改进.谢谢! 这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webp

webpack入坑之旅(三)webpack.config入门

这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不是开始的开始 webpack入坑之旅(二)loader入门 webpack入坑之旅(三)webpack.config入门 webpack入坑之旅(四)扬帆起航 webpack入坑之旅(五)加载vue单文件组件 webpack入坑之旅(六)配合vue-router实现SPA 在上面我们已经尝试过了两种