3

このiOS の質問に似た、C# (WinForms) でアプリケーションを作成しようとしています。

私はそれの一部を機能させることができました。このアルゴリズムを使用して画像をぼかすことができます

また、選択長方形を描画することもできますが、長方形をぼかしたり通過させたりすることに問題があるかどうかはわかりません。以下のようにファイルを添付しました。 ぼかし効果

ご覧のとおり、ぼかしは選択ボックスの外側にあります。

以下のコードを貼り付けました。

// 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;
        }       

私が直面しているもう 1 つの問題は、フォームが最初に読み込まれるときに最小化モードで開始され、選択 (赤い四角形) を使用すると、アプリケーションを最大化すると、画像の選択された部分が異なることです。

事前に助け/提案をありがとう。同様のツールへのリンクがある場合は、見逃している可能性があるので共有してください。ありがとう

4

1 に答える 1

1

PictureBox で画像が引き伸ばされているために、この問題が発生している可能性があります。SizeModePictureBoxのプロパティを に設定することで、これが問題であることを確認できますNormal

これは一連のイベントです。

  1. 選択長方形が描画されます。
  2. 選択のポイント/長方形が決定されます。
  3. ストレッチされていない画像が PictureBox から取得され、計算された四角形と共に Blur メソッドに渡されます。
  4. 引き伸ばされていない画像は、長方形で表された領域でぼやけています。
  5. 引き伸ばされていない画像がぼやけ、PictureBox に割り当てられます。
  6. SizeModePictureBox は、その設定に従って画像を引き伸ばします。

これにより、選択した場所とは異なる場所で画像がぼやけて見えるようになります。

あなたが持っているコードは、選択長方形を見て、それらのポイントを使用して、イメージの引き伸ばされたバージョンではなく、元のイメージを操作します。引き伸ばされた画像をぼかしたい場合は、まず引き伸ばされた画像を取得してから、その画像で選択された四角形にぼかしを適用する必要があります。次に例を示します。

    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

于 2013-09-30T18:58:03.120 に答える