c# 图片简单模糊 非高斯模糊
/// <summary>
/// 图像模糊化
/// </summary>
/// <param name="bitmap">原始图像</param>
/// <returns>模糊化后的图像</returns>
public static Bitmap Blur(Bitmap bitmap, int radius, float sigma)
{
if (bitmap == null)
{
return null;
}
int width = bitmap.Width;
int height = bitmap.Height;
float pa = (float)(1 / (Math.Sqrt(2 * Math.PI) * sigma));
float pb = -1.0f / (2 * sigma * sigma);
// generate the Gauss Matrix
float[] gaussMatrix = new float[radius * 2 + 1];
float gaussSum = 0f;
for (int i = 0, x = -radius; x <= radius; ++x, ++i)
{
float g = (float)(pa * Math.Exp(pb * x * x));
gaussMatrix[i] = g;
gaussSum += g;
}
for (int i = 0, length = gaussMatrix.Length; i < length; ++i)
{
gaussMatrix[i] /= gaussSum;
}
try
{
Bitmap bmpReturn = new Bitmap(width, height, PixelFormat.Format24bppRgb);
BitmapData srcBits = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
BitmapData targetBits = bmpReturn.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
unsafe
{
byte* pSrcBits = (byte*)srcBits.Scan0.ToPointer();
byte* pTargetBits = (byte*)targetBits.Scan0.ToPointer();
int stride = srcBits.Stride;
byte* pTemp;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (x == 0 || x == width - 1 || y == 0 || y == height - 1)
{
//最边上的像素不处理
pTargetBits[0] = pSrcBits[0];
pTargetBits[1] = pSrcBits[1];
pTargetBits[2] = pSrcBits[2];
}
else
{
//取周围9点的值
int r1, r2, r3, r4, r5, r6, r7, r8, r9;
int g1, g2, g3, g4, g5, g6, g7, g8, g9;
int b1, b2, b3, b4, b5, b6, b7, b8, b9;
float fR, fG, fB;
//左上
pTemp = pSrcBits - stride - 3;
r1 = pTemp[2];
g1 = pTemp[1];
b1 = pTemp[0];
//正上
pTemp = pSrcBits - stride;
r2 = pTemp[2];
g2 = pTemp[1];
b2 = pTemp[0];
//右上
pTemp = pSrcBits - stride + 3;
r3 = pTemp[2];
g3 = pTemp[1];
b3 = pTemp[0];
//左侧
pTemp = pSrcBits - 3;
r4 = pTemp[2];
g4 = pTemp[1];
b4 = pTemp[0];
//右侧
pTemp = pSrcBits + 3;
r5 = pTemp[2];
g5 = pTemp[1];
b5 = pTemp[0];
//右下
pTemp = pSrcBits + stride - 3;
r6 = pTemp[2];
g6 = pTemp[1];
b6 = pTemp[0];
//正下
pTemp = pSrcBits + stride;
r7 = pTemp[2];
g7 = pTemp[1];
b7 = pTemp[0];
//右下
pTemp = pSrcBits + stride + 3;
r8 = pTemp[2];
g8 = pTemp[1];
b8 = pTemp[0];
//自己
pTemp = pSrcBits;
r9 = pTemp[2];
g9 = pTemp[1];
b9 = pTemp[0];
fR = (float)(r1 + r2 + r3 + r4 + r5 + r6 + r7 + r8 + r9);
fG = (float)(g1 + g2 + g3 + g4 + g5 + g6 + g7 + g8 + g9);
fB = (float)(b1 + b2 + b3 + b4 + b5 + b6 + b7 + b8 + b9);
fR /= 9;
fG /= 9;
fB /= 9;
pTargetBits[0] = (byte)fB;
pTargetBits[1] = (byte)fG;
pTargetBits[2] = (byte)fR;
}
pSrcBits += 3;
pTargetBits += 3;
}
pSrcBits += srcBits.Stride - width * 3;
pTargetBits += srcBits.Stride - width * 3;
}
}
bitmap.UnlockBits(srcBits);
bmpReturn.UnlockBits(targetBits);
return bmpReturn;
}
catch
{
return null;
}
}
c# 图片简单模糊 非高斯模糊的更多相关文章
- 分别用css3、JS实现图片简单的无缝轮播功效
本文主要介绍分别使用CSS3.JS实现图片简单无缝轮播功效: 一.使用CSS3实现:利用animation属性 (实现一张一张的轮播,肉眼只看见一张图片) HTML部分比较简单,两个div下包着几个i ...
- 使用AS3.0代码实现给图片添加滤镜的模糊与斜角效果
滤镜可应用于任何显示对象(即,从 DisplayObject 类继承的对象), 例如 MovieClip.SimpleButton.TextField 和 Video 对象,以及 BitmapData ...
- JavaScript Html2canvas 生成高清图片(移动端模糊问题)
最近在做一个移动端的项目,简单记录一下该功能. 需求是这样的: 将带有二维码和一些介绍信息 动态生成一张图片 比如说是 生成这样的图片,文字.主图.价格.二维码都是不固定的. 对于这个需求,看见微信上 ...
- 【JavaScript】图片加载由模糊变清晰 —— 图片优化
开发过程中,一些图片的展示时,加载很慢很久,后来把图片缩放压成缩略图吧,速度是快了但是模糊不清,如何处理这样问题,下面就和大家分享一下自己的处理方法. 先让客户端加载像素小的缩略图: <img ...
- 教你用ps如何将图片、文字做出模糊斑驳的作旧效果
1.对图片的图层执行滤镜-风格化-扩散,选变亮优先. 2.选择画笔工具,在画笔选项里选择喷溅59像素,画笔大小我用的是100px,大家可以根据自己的情况自定义大小,前景设置为黑色. 3.在图章图层上方 ...
- HTML5使用canvas画图时,图片被自动放大模糊的问题
最近在研究canvas技术,发现一个问题,就是所画图像会随着画布大小自动变换大小.原因如下 <canvas id="cxt" style="width: 500px ...
- 使用 WinAFL 图片解析软件进行模糊测试 - FreeImage 图片解析库
看雪链接:https://bbs.pediy.com/thread-255162.htm
- 动态svg图片简单制作
一.简介 #topics #no-box-shadow-img { box-shadow: none } 博主头像 svg图片格式不同于其它图片格式,svg图片本质上是一个xml文件,它内部是标记语言 ...
- FileReader (三) - 网页拖拽并预显示图片简单实现
以下是一个很贱很简单的一个 在网页上图拽图片并预显示的demo. 我是从https://developer.mozilla.org/en-US/docs/Web/API/FileReader#Stat ...
随机推荐
- POJ3260:The Fewest Coins(混合背包)
Description Farmer John has gone to town to buy some farm supplies. Being a very efficient man, he a ...
- DOS 选择跳转实现、dos + bcp 双击导入和导出数据
DOS 选择跳转实现.dos + bcp 双击导入和导出数据 option.bat @echo off :Start2 cls goto Start :Start title Frequently U ...
- IOS上 关于状态栏的相关设置(UIStatusBar)
知识普及 ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时间等部分: 背景部分:就是显示黑色或者图片的背景部分: 如 ...
- LR使用Java User协议环境报错Please add the <JDK>\bin to the path and try again
看标题报错信息就知道,这是java编译及运行环境配置问题,运行LR脚本时,LR代理找不到java的JDK环境,当然,可能有人会遇到说,我在cmd窗口javac 环境是没问题的呀,是的,这就要看你的jd ...
- 前端--关于CSS
CSS全名层叠样式表,层叠的含义有三个:1.按照特殊性的高低,特殊性高的覆盖特殊性低的样式声明:2.不同属性的样式声明要合并:3.后出现的相同的样式声明覆盖先出现的.所以要改变样式的优先级也有三种方法 ...
- ADO.NET程序访问数据的组件
组成--数据集(内存中的数据库) --DataSet数据集 --DataTable数据表 --DataColumn数据列 --DataRow数据行 --DataView数据视图--NET数据提供程序 ...
- noip2015 提高组day1、day2
NOIP201505神奇的幻方 试题描述 幻方是一种很神奇的N∗N矩阵:它由数字 1,2,3,……,N∗N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方 ...
- 分享一个jdk源码链接
请查看下面的链接:http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/file/bcba89ce0a8c/src/share/classes/,进入页面后,点击列表中 ...
- js前台获取list的demo
后台 bannerlist=homePageService.searchBanner(bannerVO); // 注意这里的Gson的构建方式为GsonBuilder,区别于test1中的Gson g ...
- linux查找命令find
-1 linux的查找命令有两个: locate find locate:有一个索引库,故速度快,但是新加入的一般不再索引库中,故可能无法查到 find:搜索速度慢,但是功能及其强大,可以追加命令动作 ...