在C#窗体中缩放时计算图像宽度

本文关键字:计算 图像 缩放 窗体 | 更新日期: 2023-09-27 18:28:31

我正在开发一个Winforms应用程序,该应用程序包含一个大地图图像(5500px乘2500px)。我已经设置好了,地图以全尺寸开始,但用户可以缩小到几个不同的比例来查看更多地图。用户可以拖动地图来改变他们正在查看的内容(如谷歌地图、必应地图、文明号等)

当地图是全尺寸的(比例=1.0)时,我可以防止用户滚动经过图像的边界。我通过计算他们是否试图移动超过0,或者超过图像宽度-当前窗口大小来实现这一点,类似于:

if (_currHScroll <= 0) { 
    _currHScroll = 0;
}

这一切都很好。但是,当我缩小地图时(从而使图像变小),地图底部和右侧的限制就会打破。我知道为什么会发生这种情况——因为执行的Transform基本上会"压缩"贴图一点,所以过去5000像素的图像现在更小了,这取决于比例。但是,我的限制是基于图像大小。

因此,用户可以滚动到地图的末尾,只看到空白。我意识到更糟糕的事情会发生,但如果可能的话,我想阻止他们这样做。

我确信有一个直接的方法可以做到这一点,但我还没有弄清楚。我试着简单地将我的计算乘以规模,但这似乎不起作用(最初似乎低估了规模,然后高估了最小的规模)。我试着计算图像右下角的变换位置,并使用它,但事实证明,这个数字是颠倒的,我找不到它与什么有关。

我在这里包括了我的变换点方法。它工作得很好。它告诉我,无论缩放级别如何,在原始图像上点击了哪个像素。因此,如果有人点击了点200200,但图像缩放为.5,它会显示类似400400的内容作为点击的内容(但是,正如我所说,我不认为缩放值是乘数——使用它只是为了演示)。

public Point GetTransformedPoint(Point mousePoint) {
    Matrix clickTransform = _mapTransform.Clone();
    Point[] xPoints = { new Point(mousePoint.X, mousePoint.Y) };
    clickTransform.Invert();
    clickTransform.TransformPoints(xPoints);
    Debug.Print("Orig: {0}, {1} -- Trans: {2}, {3}", mousePoint.X, mousePoint.Y, xPoints[0].X, xPoints[0].Y);
    return xPoints[0];
}

非常感谢。我确信这是一个相对容易被我忽略的东西,但几个小时后,我就找不到了。

在C#窗体中缩放时计算图像宽度

如果我理解正确,您可以使用GetTransformedPoint方法计算最大值,方法是使用图像的宽度和高度作为点。然后可以在您的支票中使用结果。。。

顺便说一句,你是对的,比例值是一个乘数,用作一个因子。唯一的问题是,您必须将结果强制转换为整数。