Вот функция, которая поможет с различными вычислениями:
void SetImageScale(PictureBox pbox, out RectangleF ImgArea , out float zoom)
{
SizeF sp = pbox.ClientSize;
SizeF si = pbox.Image.Size;
float rp = sp.Width / sp.Height; // calculate the ratios of
float ri = si.Width / si.Height; // pbox and image
if (rp > ri)
{
zoom = 1f * sp.Height / si.Height;
float width = si.Width * zoom;
float left = (sp.Width - width) / 2;
ImgArea = new RectangleF(left, 0, width, sp.Height);
}
else
{
zoom = 1f * sp.Width / si.Width;
float height = si.Height * zoom;
float top = (sp.Height - height) / 2;
ImgArea = new RectangleF(0, top, sp.Width, height);
}
}
Вот как вы можете использовать его, учитывая Rectangle Rect
, который вы создали из координат мыши:
float zoom = 1f;
RectangleF ImgArea = Rectangle.Empty;
SetImageScale(pictureBox1, out ImgArea, out zoom);
Point RLoc = Point.Round(new PointF( (Rect.X - ImgArea.X) / zoom,
(Rect.Y - ImgArea.Y) / zoom ));
Size RSz = Size.Round(new SizeF(Rect.Width / zoom, Rect.Height / zoom));
label1.Text = "Selection in mouse coordinates: " + Rect.ToString();
label2.Text = "Selection in image coordinates: " + new Rectangle(RLoc, RSz).ToString();
Это должно работать независимо от того, являются ли изображения альбомными или портретными или какое отношение больше, если оно есть, к изображениям или PictureBox.
Примечаниечто с сильно увеличенным изображением трудно сделать выбор пикселя с дефектом ..
Эта функция является вариантом из этого поста .