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?
source to share
Here's an example that draws the second rectangle from the right when you draw the first:
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 ..
source to share