获取真实的鼠标在图像的实际大小中的位置,而不是PictureBox中鼠标的位置

时间:2012-11-16 06:30:36

标签: c# .net c#-4.0 mouseevent picturebox

我的图像大小为1278 X 958,我正在对其进行一些图像处理。

由于图像尺寸很大,我在pictureBox中使用以下命令加载它:

imGrayShow = cap.QueryGrayFrame();
picBOriginal.Image = imGrayShow.ToBitmap();

pictureBox大小是299 X 204并且在pictureBox中看到我的原始图像我把

pictureBox Size Mode = StretchImage

故事从这里开始:

我想使用鼠标按下&鼠标加载事件以获取用户使用以下命令选择的区域的位置:

 private void picBOriginal_MouseUp(object sender, MouseEventArgs e)
        {
            if (stopEventMouseDrag == true)
            {
                endP = e.Location;

                if (startP != endP)
                {
                    stopEventMouseDrag = false;
                }
            }
        }

        private void picBOriginal_MouseDown(object sender, MouseEventArgs e)
        {
            if (stopEventMouseDrag == true)
            {
                startP = e.Location;
            }
        }

我得到的是 startP endP (145,2)(295,83)分别;但这些是mouseBox在pictureBox中的位置,而我希望在原始Image中找到鼠标向下和鼠标按下的真实位置。 (这是=> startP: 890,1 endP: 1277,879

我怎么可能在原始图像中获得startP-endP的REAL位置?

2 个答案:

答案 0 :(得分:4)

我认为你的数学有点偏差。如果您有一个1278 x 958图像,并且想要将其缩小到299像素宽,则需要将所有内容除以1278 / 299 4.27 。要保持纵横比相同,宽度必须为958 / 4.27,其舍入为 224

然后当你收到鼠标下来的坐标时启动事件,您只需将坐标乘以 4.27 即可将值向上扩展为原始图像。

答案 1 :(得分:1)

startP和endP是相对于您的图片框或相对于屏幕的点?根据我的记忆,Location中的MouseEventArgs是相对于表单的,这不是很有用。

所以...它可能会结束这样的事情:

// Position of the mouse, relative to the upper left corner of the picture box.
Point controlRelative = myPictureBox.PointToClient(MousePosition);
// Size of the image inside the picture box
Size imageSize = myPictureBox.Image.Size;
// Size of the picture box
Size boxSize = myPictureBox.Size;

Point imagePosition = new Point((imageSize.Width / boxSize.Width) * controlRelative.X,
                                (imageSize.Height / boxSize.Height) * controlRelative.Y);