在当前鼠标位置缩放/拉伸图片框?

4

问:如何在图片框上实现以当前鼠标位置为基点的缩放,类似于Google Maps中的缩放?

我正在设计一个简单的GIS /地图引擎作为我的毕业论文。该应用程序被设计成使地图加载到轻微修改的选项卡控件的选项卡中。

地图是标准的JPEG或PNG格式数字图像,其中大多数分辨率很高(2000x2000像素及以上)。

它们被加载到作为选项卡页的子控件的图片框中。我已经实现了一个简单的缩放方法作为按钮单击事件,仅缩放到图像/图片框的中心。

我想做的是通过鼠标滚轮事件在当前鼠标位置实现缩放,使图片在图片框内缩放。

目前的缩放代码如下:

            timesZoomed += 1;
            zoomRatio += 0.1f;
            pbxMapa.Width = pbxMapa.Width * zoomRatio;
            pbxMapa.Height = pbxMapa.Height * zoomRatio;
            pbxMapa.Location = new Point((this.Width / 2) - (pbxMapa.Width / 2), this.Height / 2) - (pbxMapa.Height / 2));
  • "zoomRatio"的默认值为1,可以增加到0.6f。
  • 参数“timesZoomed”的默认值为0,最多可以增加到6。
  • “pbxMapa”是加载地图图像的picturebox。Picturebox的“ImageSizeMode”属性设置为“Zoom”,但picturebox的大小设置为加载的地图图像的全尺寸。

另外,我正在尝试这个简单的缩放代码。计算有些有效,但当缩放/乘以更大的比例时仍然存在相当大的偏移:

                pbxMapa.Location = new Point(pbxMapa.Location.X + (int)((pbxMapa.Location.X * zoomRatio - mouseXPbx) / 8), pbxMapa.Location.Y + (int)((pbxMapa.Location.Y * zoomRatio - mouseYPbx) / 8));
  • "mouseXPbx"和"mouseYPbx"变量代表当前鼠标在"pbxMapa"中的位置。我将其除以8是为了减小定位时的偏移。

任何帮助和建议都将不胜感激,提前致谢。


我该如何在鼠标位置缩放或拉伸picturebox?类似于Google地图上的缩放? - Filip Filipovic
你的代码有什么问题?抱歉,我不知道问题出在哪里。你尝试过阅读任何文章吗?这是一个有趣的链接 - Renatas M.
我的代码没有问题,它像预期的那样缩放到中心。我需要帮助第二个代码示例,它没有像应该那样缩放...当我尝试缩放到当前鼠标位置时存在一些偏移。顺便说一下,感谢这篇文章。 - Filip Filipovic
你正在移动控件,以改变相对鼠标位置。这不是正确的方法,应该在Paint事件中绘制地图,使用e.Graphics.DrawImage,并使用e.Graphics.TranslateTransform和ScaleTransform来移动和缩放图像。 - Hans Passant
2个回答

5
以下代码会在当前鼠标位置缩放和拉伸pictureBox:
pictureBox1.Width = (int)(pictureBox1.Width * zoomratio );
pictureBox1.Height = (int)(pictureBox1.Height * zoomratio );                
pictureBox1.Top = (int)(e.Y - zoomratio * (e.Y - pictureBox1.Top));
pictureBox1.Left = (int)(e.X - zoomratio * (e.X - pictureBox1.Left));

@Ebro,请问 zoomratio 是什么意思?更新您的答案,让它更加完整。我想给您一个+1。 - sam
@J3soon,如果您能帮忙的话也请您帮一下。 - sam
@sam 请查看原帖问题,zoomratio只是一个控制缩放的数字。如果它大于1,则为放大,否则为缩小。 - J3soon
@J3soon 它不会正常工作,它只是移动图像...有人能分享他们在这个问题上的经验吗? - sam

0

我成功地调整了这行代码中位置的计算。它正常工作,缩放的方式正好符合我的需求。

pbxMapa.Location = new Point(pbxMapa.Location.X + (int)(((pbxMapa.Location.X - mouseXPbx) / 10) * zoomRatio), pbxMapa.Location.Y + (int)(((pbxMapa.Location.Y - mouseYPbx) / 10) * zoomRatio));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接