我将使用以下方法:
TranslatePictureBoxSelectedRectangleToImage
将图片框上选定的矩形转换为图像上的坐标。
TranslateImageSelectedRectangleToPictureBox
将图像框上的选定矩形转换为图片框上的坐标。
ScaleRectangle
按给定的比例因子缩放矩形。
TranslatePictureBoxSelectedRectangleToImage
public RectangleF TranslatePictureBoxSelectedRectangleToImage(PictureBox p,
RectangleF pictureBoxSelectedRectangle)
{
var method = typeof(PictureBox).GetMethod("ImageRectangleFromSizeMode",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var imageRect = (Rectangle)method.Invoke(p, new object[] { p.SizeMode });
if (p.Image == null)
return pictureBoxSelectedRectangle;
var cx = (float)p.Image.Width / (float)imageRect.Width;
var cy = (float)p.Image.Height / (float)imageRect.Height;
var r2 = pictureBoxSelectedRectangle;
r2.Offset(-imageRect.X, -imageRect.Y);
return new RectangleF(r2.X * cx, r2.Y * cy, r2.Width * cx, r2.Height * cy);
}
TranslateImageSelectedRectangleToPictureBox
public RectangleF TranslateImageSelectedRectangleToPictureBox(PictureBox p,
RectangleF imageSelectedRectangle)
{
var method = typeof(PictureBox).GetMethod("ImageRectangleFromSizeMode",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var imageRect = (Rectangle)method.Invoke(p, new object[] { p.SizeMode });
if (p.Image == null)
return imageSelectedRectangle;
var cx = (float)p.Image.Width / (float)imageRect.Width;
var cy = (float)p.Image.Height / (float)imageRect.Height;
var r2 = new RectangleF(imageSelectedRectangle.X / cx, imageSelectedRectangle.Y / cy,
imageSelectedRectangle.Width / cx, imageSelectedRectangle.Height / cy);
r2.Offset(imageRect.X, imageRect.Y);
return r2;
}
比例矩形
public RectangleF ScaleRectangle(RectangleF r, float c)
{
return new RectangleF(r.X * c, r.Y * c, r.Width * c, r.Height * c);
}
示例
在以下假设下使用上述方法:
- 您有
image1 的原始大小和 image2,这是 image1 的编程调整大小版本,缩放系数为 c。 (意思是c = (float)image2.Width/(float)image1.Width。)
- 您正在以缩放模式在图片框中显示
image2。
问题 1 - 将 r1 作为 picureBox1 上的选定矩形,image1 上的矩形大小和位置是多少?
第一种方法展示了如何将图片框上的r1 转换为image2 上的矩形。要将其转换为image1 上的矩形,由于您知道用于从 image1 创建 image2 的缩放因子,因此对第一种方法的结果应用相同的缩放因子就足够了:
//First convert rectangle of pictureBox1 to rectangle of image2
var r2 = TranslatePictureBoxSelectedRectangleToImage(pictureBox1, r1);
//Then convert rectangle of image2 to rectangle of image1
var result = ScaleRectangle(r2, 1f/c);
问题 2 - 将 r1 作为 image1 上的选定矩形,pictureBox1 上的矩形大小和位置是多少?
第二种方法显示了如何将image2 上的r1 转换为pictureBox1 上的矩形。要从 image1 上的矩形进行转换,因为您知道用于从 image1 创建 image2 的缩放因子,因此在 r1 上应用相同的缩放因子以获取 image2 上的矩形就足够了,然后使用第二个方法:
//First convert rectangle of the image1 to rectangle of image2
var r2 = ScaleRectangle(r1, c);
//Then convert rectangle of image2 to rectangle of pictureBox1
var result = TranslateImageSelectedRectangleToPictureBox(pictureBox1, r2);