像 google plus 一样在 C# 中模糊图像
Bluring images in C# just as google plus does
我正在尝试使用以下代码片段为我的图像添加模糊滤镜:
public static Bitmap DoBlur(this Bitmap image, Int32 blurSize) {
var rectangle = new Rectangle(0, 0, image.Width, image.Height);
Bitmap blurred = new Bitmap(image.Width, image.Height);
// make an exact copy of the bitmap provided
using (Graphics graphics = Graphics.FromImage(blurred))
graphics.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height),
new Rectangle(0, 0, image.Width, image.Height), GraphicsUnit.Pixel);
// look at every pixel in the blur rectangle
for (Int32 xx = rectangle.X; xx < rectangle.X + rectangle.Width; xx++) {
for (Int32 yy = rectangle.Y; yy < rectangle.Y + rectangle.Height; yy++) {
Int32 avgR = 0, avgG = 0, avgB = 0;
Int32 blurPixelCount = 0;
// average the color of the red, green and blue for each pixel in the
// blur size while making sure you don't go outside the image bounds
for (Int32 x = xx; (x < xx + blurSize && x < image.Width); x++) {
for (Int32 y = yy; (y < yy + blurSize && y < image.Height); y++) {
Color pixel = blurred.GetPixel(x, y);
avgR += pixel.R;
avgG += pixel.G;
avgB += pixel.B;
blurPixelCount++;
}
}
avgR = avgR / blurPixelCount;
avgG = avgG / blurPixelCount;
avgB = avgB / blurPixelCount;
// now that we know the average for the blur size, set each pixel to that color
for (Int32 x = xx; x < xx + blurSize && x < image.Width && x < rectangle.Width; x++)
for (Int32 y = yy; y < yy + blurSize && y < image.Height && y < rectangle.Height; y++)
blurred.SetPixel(x, y, Color.FromArgb(avgR, avgG, avgB));
}
}
return blurred;
}
这是我在互联网上找到的 of-course。我正在尝试将图像模糊成这样:
被 google 加为封面。但我能得到的最好结果是这样的:
如你所见,我什至没有关闭!你知道 google 使用的是什么过滤器吗?或者我怎样才能做到这一点?
这是我正在测试的原件:
我之前使用过 2 个插件来模糊图像:
http://nbartlomiej.github.io/foggy/
两者都很好用。非常容易理解的例子在他们的主页上。
它们都需要调整不透明度和模糊半径才能获得您想要的效果。
对我来说,您的尝试似乎缺少不透明叠加层。
主要问题是您使用源左侧和下方的像素模糊了像素,但右侧和顶部的像素却没有。
尝试将您的内部循环更改为:
for (Int32 x = Math.Max(0, xx - blurSize); x <= Math.Min(xx + blurSize, image.Width-1); x++)
{
for (Int32 y = Math.Max(0, yy - blurSize); y <= Math.Min(yy + blurSize, image.Height-1); y++)
{
我正在尝试使用以下代码片段为我的图像添加模糊滤镜:
public static Bitmap DoBlur(this Bitmap image, Int32 blurSize) {
var rectangle = new Rectangle(0, 0, image.Width, image.Height);
Bitmap blurred = new Bitmap(image.Width, image.Height);
// make an exact copy of the bitmap provided
using (Graphics graphics = Graphics.FromImage(blurred))
graphics.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height),
new Rectangle(0, 0, image.Width, image.Height), GraphicsUnit.Pixel);
// look at every pixel in the blur rectangle
for (Int32 xx = rectangle.X; xx < rectangle.X + rectangle.Width; xx++) {
for (Int32 yy = rectangle.Y; yy < rectangle.Y + rectangle.Height; yy++) {
Int32 avgR = 0, avgG = 0, avgB = 0;
Int32 blurPixelCount = 0;
// average the color of the red, green and blue for each pixel in the
// blur size while making sure you don't go outside the image bounds
for (Int32 x = xx; (x < xx + blurSize && x < image.Width); x++) {
for (Int32 y = yy; (y < yy + blurSize && y < image.Height); y++) {
Color pixel = blurred.GetPixel(x, y);
avgR += pixel.R;
avgG += pixel.G;
avgB += pixel.B;
blurPixelCount++;
}
}
avgR = avgR / blurPixelCount;
avgG = avgG / blurPixelCount;
avgB = avgB / blurPixelCount;
// now that we know the average for the blur size, set each pixel to that color
for (Int32 x = xx; x < xx + blurSize && x < image.Width && x < rectangle.Width; x++)
for (Int32 y = yy; y < yy + blurSize && y < image.Height && y < rectangle.Height; y++)
blurred.SetPixel(x, y, Color.FromArgb(avgR, avgG, avgB));
}
}
return blurred;
}
这是我在互联网上找到的 of-course。我正在尝试将图像模糊成这样:
被 google 加为封面。但我能得到的最好结果是这样的:
如你所见,我什至没有关闭!你知道 google 使用的是什么过滤器吗?或者我怎样才能做到这一点?
这是我正在测试的原件:
我之前使用过 2 个插件来模糊图像:
http://nbartlomiej.github.io/foggy/
两者都很好用。非常容易理解的例子在他们的主页上。
它们都需要调整不透明度和模糊半径才能获得您想要的效果。
对我来说,您的尝试似乎缺少不透明叠加层。
主要问题是您使用源左侧和下方的像素模糊了像素,但右侧和顶部的像素却没有。
尝试将您的内部循环更改为:
for (Int32 x = Math.Max(0, xx - blurSize); x <= Math.Min(xx + blurSize, image.Width-1); x++)
{
for (Int32 y = Math.Max(0, yy - blurSize); y <= Math.Min(yy + blurSize, image.Height-1); y++)
{