【问题标题】:C# Blurring an ImageC# 模糊图像
【发布时间】:2016-08-17 17:10:10
【问题描述】:

我试图在 C# 中通过遍历一个图像的所有像素来模糊图像,然后创建一个新的位图,其中原始图像中像素的颜色除以像素数以创建平均颜色。当我运行它时,什么也没有发生。代码如下:

private void blurToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Bitmap img = new Bitmap(pictureBox1.Image);
        Bitmap blurPic = new Bitmap(img.Width, img.Height);

        Int32 avgR = 0, avgG = 0, avgB = 0;
        Int32 blurPixelCount = 0;

        for (int y = 0; y < img.Height; y++)
        {
            for (int x = 0; x < img.Width; x++)
            {
                Color pixel = img.GetPixel(x, y);
                avgR += pixel.R;
                avgG += pixel.G;
                avgB += pixel.B;

                blurPixelCount++;
            }
        }

        avgR = avgR / blurPixelCount;
        avgG = avgG / blurPixelCount;
        avgB = avgB / blurPixelCount;

        for (int y = 0; y < img.Height; y++)
        {
            for (int x = 0; x < img.Width; x++)
            {
                blurPic.SetPixel(x, y, Color.FromArgb(avgR, avgG, avgB));
            }
        }

        img = blurPic;
    }

谢谢!

【问题讨论】:

  • 使用BlurEffect。不要试图重新发明轮子。
  • 我相信你的img对象只有在这个方法完成后才存在于内存中......你不必将它写到一个新文件中吗?
  • @HighCore BlureEffect 只能在DependencyObject 上使用,并非在所有情况下都可用。
  • @AmirOveisi 在什么情况下您的Visual 不是DependencyObject
  • @HighCore 如果你不使用WPF/SL 项目,那么你就没有DependencyObject!这里@user2816235 使用带有EventArgs 的代码来单击按钮而不是RoutedEventArgs。所以我认为这不是WPF/SL 相关问题,而是关于WinFrom。所以这里没有DependencyObject

标签: c# image blur


【解决方案1】:

在方法结束时使用pictureBox1.Image = blurPic;

【讨论】:

    【解决方案2】:

    这是在 c# 代码中模糊图像的最简单方法,但注意,您必须等待图像完全加载,然后才能开始处理它

    简而言之,我们将为您的图像使用 ImageOpened 事件处理程序。因此,我们将使用 WriteableBitmap 类,该类具有模糊图像和对图像应用各种效果的方法。

    WriteableBitExtensions 包含我们将要使用的 GaussianBlur5x5。

    此代码假定您从 url 获取图像,因此我们首先下载图像以从网络获取流的内容。但是如果你的图片是本地的,那么你可以先将它转换成一个 IRandomAccessStream 并作为参数传递。

    double height = pictureBox1.ActualHeight;
            double width = pictureBox1.ActualWidth;
    
            HttpClient client = new HttpClient();
            HttpResponseMessage response = await client.GetAsync("image-url-goes-here");
    
            var webResponse = response.Content.ReadAsStreamAsync();
            randomStream = webResponse.Result.AsRandomAccessStream();
            randomStream.Seek(0);
    
    
            wb = wb.Crop(50, 50, 400, 400);
            wb = wb.Resize(10,10 ,         WriteableBitmapExtensions.Interpolation.NearestNeighbor);
            wb = WriteableBitmapExtensions.Convolute(wb,WriteableBitmapExtensions.KernelGaussianBlur5x5);
    
            pictureBox1.Source= wb;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 2015-06-10
      • 2014-06-13
      • 2015-09-19
      • 2019-02-02
      • 2019-05-13
      相关资源
      最近更新 更多