2013-09-30 2 views
1

Я пытаюсь создать приложение в C# (WinForms), что-то похожее на это iOS QuestionРазмытия выбранной часть изображения

мне удалось получить часть его работу, я могу размыть изображение с помощью этого algorithm

Также я могу нарисовать прямоугольник выделения, я не знаю, не ошибаюсь ли я с размытием или пропусканием прямоугольника. Я приложил файл, как показано ниже. Blurring Effect

Как видно, размытие вне рамки выбора.

Я вставил код ниже:

// Start Rectangle 
     private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
     { 
      // Determine the initial rectangle coordinates... 
      RectStartPoint = e.Location; 
      Invalidate(); 
     } 

     private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (e.Button != MouseButtons.Left) 
       return; 
      Point tempEndPoint = e.Location; 
      Rect.Location = new Point(
       Math.Min(RectStartPoint.X, tempEndPoint.X), 
       Math.Min(RectStartPoint.Y, tempEndPoint.Y)); 
      Rect.Size = new Size(
       Math.Abs(RectStartPoint.X - tempEndPoint.X), 
       Math.Abs(RectStartPoint.Y - tempEndPoint.Y)); 
      pictureBox1.Invalidate(); 
     } 



     // Draw Area 
     private void pictureBox1_Paint(object sender, PaintEventArgs e) 
     { 
      // Draw the rectangle... 
      if (pictureBox1.Image != null) 
      { 
       if (Rect != null && Rect.Width > 0 && Rect.Height > 0) 
       {       
        e.Graphics.DrawRectangle(selectionPen, Rect); 
       } 
      } 
     } 


     private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
     { 
      //Right now I am using right click as a call to blur 
      if (e.Button == MouseButtons.Right) 
      { 
       if (Rect.Contains(e.Location)) 
       {       
        pictureBox1.Image = Blur(pictureBox1.Image, Rect, 5); 
        pictureBox1.Refresh(); 
       } 
      } 
     } 

     private void blurPageToolStripMenuItem_Click(object sender, EventArgs e) 
     {    
      FullRect = new Rectangle(0, 0, pictureBox1.Image.Width, pictureBox1.Image.Height); 
      pictureBox1.Image = Blur(pictureBox1.Image, FullRect, 5); 
     } 

     private System.Drawing.Image Blur(System.Drawing.Image image, Rectangle rectangle, Int32 blurSize) 
     { 
      Bitmap blurred = new Bitmap(image); //image.Width, image.Height); 
      using (Graphics graphics = Graphics.FromImage(blurred)) 
      { 
       // look at every pixel in the blur rectangle 
       for (Int32 xx = rectangle.Left; xx < rectangle.Right; xx += blurSize) 
       { 
        for (Int32 yy = rectangle.Top; yy < rectangle.Bottom; yy += blurSize) 
        { 
         Int32 avgR = 0, avgG = 0, avgB = 0; 
         Int32 blurPixelCount = 0; 
         Rectangle currentRect = new Rectangle(xx, yy, blurSize, blurSize); 

         // 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 = currentRect.Left; (x < currentRect.Right && x < image.Width); x++) 
         { 
          for (Int32 y = currentRect.Top; (y < currentRect.Bottom && 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 
         graphics.FillRectangle(new SolidBrush(Color.FromArgb(avgR, avgG, avgB)), currentRect);        
        } 
       } 
       graphics.Flush(); 
      } 
      return blurred; 
     }  

Еще одна проблема, я облицовкой, когда форма загружается на начальном этапе, она начинает в свернутом режиме, теперь, если я использую выделение (красный прямоугольник), и то, если я максимизирую приложение, выбранная часть изображения отличается.

Благодарим за помощь/предложение заблаговременно. Если какие-либо ссылки на подобный инструмент вокруг, пожалуйста, разделите, поскольку я, возможно, пропустил его. Спасибо

+0

Не уверены, но 'х

+0

Спасибо, я попробую. –

+0

Спасибо, я пробовал, но это не сработало. Приложение теперь зависает с || вместо &&. –

ответ

1

Возможно, у вас возникла эта проблема, потому что ваше изображение растянуто в PictureBox. Вы можете проверить, что это проблема, установив свойство SizeMode PictureBox на Normal.

Это последовательность событий:

  1. Прямоугольник выделения рисуется.
  2. Определяется точка/прямоугольник для выбора.
  3. Растянутое изображение извлекается из PictureBox и передается методу Blur с вычисленным прямоугольником.
  4. Несравненное изображение размыто над областью, обозначенной прямоугольником.
  5. Разделенное изображение, теперь размытое, присваивается PictureBox.
  6. PictureBox растягивает изображение в соответствии с его настройкой SizeMode.

Это означает, что изображение размыто в другом месте, чем вы выбрали.

Код, который вы просматриваете в прямоугольнике выделения, и использует эти точки для работы с исходным изображением, а не с растянутой версией изображения. Если вы хотите размыть растянутое изображение, вам нужно сначала получить растянутое изображение, а затем применить размытие к прямоугольнику, выбранному на этом изображении. Вот пример:

private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     //Right now I am using right click as a call to blur 
     if (e.Button == MouseButtons.Right) 
     { 
      if (Rect.Contains(e.Location)) 
      { 
       pictureBox1.Image = Blur(getPictureBoxImage(), Rect, 5); 
       pictureBox1.Refresh(); 
      } 
     } 
    } 

    private Bitmap getPictureBoxImage() 
    { 
     Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
     using (Graphics g = Graphics.FromImage(bmp)) 
     { 
      g.DrawImage(pictureBox1.Image, 
       new Rectangle(0, 0, bmp.Width, bmp.Height)); 
     } 
     return bmp; 
    } 

код для извлечения растянутого изображения выводится из этого ответа: https://stackoverflow.com/a/8702405/935052

+0

Спасибо за ответ, теперь я вижу проблему. Кроме того, этот небольшой, но эффективный фрагмент кода работал как шарм. –

Смежные вопросы