缩小矩形以显示它在大原始图像中的样子

Downscaling a Rectangle to Display as it would look in the Large Original Image

我在 PictureBox 中显示图像,并允许用户通过提供以编程方式确定的矩形 rectangle.The 位置的宽度和高度来指定图像中的区域。

picturebox 中显示的图像被缩小以保存处理 time.So 如果用户指定 200X200 矩形,这在预览图像中可能看起来很大,但在原始图像中会非常小,这可能相当大.

如何缩小或平移矩形以显示它在大 image.Currently 中的外观 我正在使用以下代码在大 image.Please 建议中放大矩形。

Rectangle ConvertToLargeRect(Rectangle smallRect, Size largeImageSize, Size smallImageSize)
{
    double xScale = (double)largeImageSize.Width / smallImageSize.Width;
    double yScale = (double)largeImageSize.Height / smallImageSize.Height;
    int x = (int)(smallRect.X * xScale + 0.5);
    int y = (int)(smallRect.Y * yScale + 0.5);
    int right = (int)(smallRect.Right * xScale + 0.5);
    int bottom = (int)(smallRect.Bottom * yScale + 0.5);
    return new Rectangle(x, y, right - x, bottom - y);
}

更新:

我将使用以下方法:

  • 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;
}

ScaleRectangle

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 上应用相同的缩放因子足以获得 [=19= 上的矩形],则使用第二种方法:

//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);