3

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

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

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

图片框大小为 299 X 204,要在图片框中查看我的原始图像,我将

图片框大小模式= StretchImage

故事从这里开始:

我想使用mouse-down & mouse-up 事件来获取用户使用以下命令选择的区域的位置:

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

我得到的startPendP 分别(145,2)(295,83);但这些是图片框中鼠标的位置,而我希望在我的原始图像中找出鼠标按下和鼠标按下的真实位置。(它们是=> startP: 890,1 endP: 1277,879

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

4

2 回答 2

4

我觉得你的数学有点不对劲。如果您有一个 1278 x 958 的图像并且您想将其缩小到 299 像素宽,那么您需要将所有内容1278 / 299除以4.27。为了保持纵横比相同,宽度需要是958 / 4.27which rounds to 224

然后,当您从鼠标向下和向上事件接收坐标时,只需将坐标乘以4.27即可将值放大到原始图像。

于 2012-11-16T06:42:11.603 回答
1

startP 和 endP 是相对于您的图片框还是相对于屏幕的点?据我记得,LocationaMouseEventArgs是相对于形式的,这不是很有用。

所以......它可能最终会是这样的:

// 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);
于 2012-11-16T06:41:42.633 回答