放大C#Winforms时计算图像宽度

时间:2015-12-30 07:55:47

标签: c# winforms image-zoom

我正在使用包含大地图图片(5500像素x 2500像素)的Winforms应用程序。我已将其设置为以全尺寸开始,但用户可以缩小到几个不同的比例以查看更多地图。用户可以拖动地图以移动他们正在查看的内容(例如Google地图,Bing地图,文明等)。

当地图为全尺寸(比例= 1.0)时,我可以阻止用户滚动浏览图像的边框。我这样做是通过计算他们是否试图超过0,或超过图像宽度 - 当前窗口大小,类似于:

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

这一切都很好。但是,当我缩小地图(因此,使图像变小)时,地图底部和右侧的限制会中断。我知道为什么会发生这种情况 - 因为基本上执行的变换&#34;压缩&#34;地图有点,所以以前的5000像素图像现在变小了,具体取决于比例。但是,我的限制因素是基于图像大小。

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

我确信有一种直接的方法可以做到这一点,但我还没想到它。我试过简单地将我的计算乘以比例,但这似乎不起作用(似乎最初低估了大小,然后对最小尺寸进行了高估)。我已经尝试计算图像右下角的变换位置,然后使用它,但事实证明,这个数字是倒置的,我无法找到它与之相关的内容。

我在这里包含了我的变换点方法。它工作得很好。它告诉我,无论缩放级别如何,都会在原始图像上单击哪个像素。因此,如果有人点击了点200,200,但图像缩放为.5,它会显示400,400像点击的内容(但正如我所说,我不认为比例值是乘数 - - 仅用于演示目的)。

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

非常感谢提前。我确定这是一件相对容易的事情,我忽略了,但几个小时后,我才发现它。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你可以使用你的方法GetTransformedPoint通过使用Image作为Point的宽度和高度来计算最大值。然后可以在检查中使用结果...

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