Convert Rectangle Selection PictureBox to SizeMode

I have two PictureBoxes

pbOriginal and pbFace. After selecting the "face" from the image in pbOriginal, I clone the selection of the rectangle and place it in pbFace. However, as pbOriginal uses SelectionMode=Stretch

, copying the actual area does not match the selected area.

How do I transform the coordinates of the rectangle so that they actually reflect the coordinates of the stretched image?

+2


source to share


1 answer


Here's an example that draws the second rectangle from the right when you draw the first:

enter image description here

Point mDown = Point.Empty;
Point mCurr = Point.Empty;

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{   mDown = e.Location;  }

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
       { mCurr = e.Location; pictureBox1.Invalidate(); }
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    Rectangle r = new Rectangle(mDown.X, mDown.Y, mCurr.X - mDown.X, mCurr.Y - mDown.Y);
    e.Graphics.DrawRectangle(Pens.Orange, r);
    pictureBox2.Invalidate();
}

private void pictureBox2_Paint(object sender, PaintEventArgs e)
{
    if (pictureBox2.Image == null) return;

    float stretch1X = 1f * pictureBox1.Image.Width / pictureBox1.ClientSize.Width;
    float stretch1Y = 1f * pictureBox1.Image.Height / pictureBox1.ClientSize.Height;

    int x = (int)(mDown.X * stretch1X);
    int y = (int)(mDown.Y * stretch1Y);
    int x2 = (int)(mCurr.X * stretch1X);
    int y2 = (int)(mCurr.Y * stretch1Y);

    Rectangle r = new Rectangle(x, y, x2 - x, y2 - y);
    e.Graphics.DrawRectangle(Pens.Orange, r);
}

      

Note that it assumes that you are drawing from top to bottom left-right.



If you want to copy the selection, you can use the same factors and the same Rectangle

as the source for the call DrawImage

:

float stretch1X = 1f * pictureBox1.Image.Width / pictureBox1.ClientSize.Width;
float stretch1Y = 1f * pictureBox1.Image.Height / pictureBox1.ClientSize.Height;

Point pt = new Point((int)(mDown.X * stretch1X), (int)(mDown.Y * stretch1Y));
Size sz = new Size((int)((mCurr.X - mDown.X) * stretch1X), 
                   (int)((mCurr.Y - mDown.Y) * stretch1Y));


Rectangle rSrc = new Rectangle(pt, sz);
Rectangle rDest= new Rectangle(Point.Empty, sz);

Bitmap bmp = new Bitmap(sz.Width, sz.Height);
using (Graphics G = Graphics.FromImage(bmp))
    G.DrawImage(pictureBox1.Image, rDest, rSrc , GraphicsUnit.Pixel);
pictureBox2.Image = bmp;

      

You can program an event MouseUp

to store finla position mCurr

and copy trgger ..

+4


source







All Articles