2013-09-25 175 views
0

我想通過遍歷一個圖像的所有像素,然後創建一個新的位圖與原始圖像中的像素的顏色除以像素數來創建一個C#平均顏色。當我運行它時,沒有任何反應。這裏是代碼: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; 
    } 

謝謝!

+0

使用[BlurEffect](http://msdn.microsoft.com/en-us/library/system.windows.media.effects.blureffect.aspx)。不要試圖重新發明輪子。 –

+0

我相信你的img對象只有在這個方法完成時纔會在內存中存在......你不必把它寫出來寫入一個新文件嗎? –

+0

@HighCore'BlureEffect'只能用於'DependencyObject'並且在所有情況下都不可用。 –

回答

1

在方法結束時使用pictureBox1.Image = blurPic;

0

這是模糊的C#代碼,但NB你要等待圖像的圖像完全加載,這樣你就可以開始在它

總之工作中,我們將使用最簡單的方法圖像的ImageOpened事件處理程序。因此,我們將使用WriteableBitmap類,它具有模糊圖像和將各種效果應用於圖像的方法。

WriteableBitExtensions包含我們將要使用的GaussianBlur5x5。

此代碼假設您從網址獲取圖像,因此我們首先下載圖像以從網絡獲取流的內容。但是如果你的圖像是本地的,那麼你可以先將它轉換爲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;