How to select an area on a PictureBox.Image with mouse in C#

后端 未结 2 1136
醉话见心
醉话见心 2020-12-24 09:08

i just wanted to put a selection on my picturebox.image but this has just become worse than some little annoying situation. I thought on another picture box over the main pi

相关标签:
2条回答
  • 2020-12-24 09:36
       private int xUp, yUp, xDown,yDown;
            private Rectangle rectCropArea;
       private void SrcPicBox_MouseUp(object sender, MouseEventArgs e)
            {
                //pictureBox1.Image.Clone();
                xUp = e.X;
                yUp = e.Y;
                Rectangle rec = new Rectangle(xDown,yDown,Math.Abs(xUp xDown),Math.Abs(yUp-yDown));
                using (Pen pen = new Pen(Color.YellowGreen, 3))
                {
    
                    SrcPicBox.CreateGraphics().DrawRectangle(pen, rec);
                }
                rectCropArea = rec;
            }
     private void SrcPicBox_MouseDown(object sender, MouseEventArgs e)
            {
                SrcPicBox.Invalidate();
    
                xDown = e.X;
                yDown = e.Y;
            }
     private void btn_upload_Click(object sender, EventArgs e)
            {
                OpenFileDialog opf = new OpenFileDialog();
              //  PictureBox SrcPicBox = new PictureBox();
                opf.Filter = "ALL images(*.*)|*.*";
                if (opf.ShowDialog() == DialogResult.OK)
                {
                    string name = opf.SafeFileName;
                    string filepath = opf.FileName;
                    File.Copy(filepath, name, true);
                    SrcPicBox.Image = Image.FromFile(opf.FileName);
                }
     private void btn_crop_Click(object sender, EventArgs e)
            {
                pictureBox3.Refresh();
                //Prepare a new Bitmap on which the cropped image will be drawn
                Bitmap sourceBitmap = new Bitmap(SrcPicBox.Image, SrcPicBox.Width, SrcPicBox.Height);
                Graphics g = pictureBox3.CreateGraphics();
    
                //Draw the image on the Graphics object with the new dimesions
                g.DrawImage(sourceBitmap, new Rectangle(0, 0, pictureBox3.Width, pictureBox3.Height), rectCropArea, GraphicsUnit.Pixel);
                sourceBitmap.Dispose();
            }
    
    0 讨论(0)
  • 2020-12-24 09:43

    I used your code, you were nearly there. You needed to Invalidate the pictureBox1 instead of the rectangle. I also added a check for the Rect so it doesn't get drawn when it's not initialized or has no size.

    Another important change: I created the Rectangle only once and I adjusted its location and size. Less garbage to clean up!

    EDIT

    I added a mouse right-click handler for the Rectangle.

    private Point RectStartPoint;
    private Rectangle Rect = new Rectangle();
    private Brush selectionBrush = new SolidBrush(Color.FromArgb(128, 72, 145, 220));
    
    // Start Rectangle
    //
    private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        // Determine the initial rectangle coordinates...
        RectStartPoint = e.Location;
        Invalidate();
    }
    
    // Draw Rectangle
    //
    private void pictureBox1_MouseMove(object sender, System.Windows.Forms.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, System.Windows.Forms.PaintEventArgs e)
    {
        // Draw the rectangle...
        if (pictureBox1.Image != null)
        {
            if (Rect != null && Rect.Width > 0 && Rect.Height > 0)
            {
                e.Graphics.FillRectangle(selectionBrush, Rect);
            }
        }
    }
    
    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            if (Rect.Contains(e.Location))
            {
                Debug.WriteLine("Right click");
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题