3

サイズが 1278 X 958 の画像があり、その上で画像処理を行っています。

画像サイズが大きいので、pictureBox で次のコマンドで読み込みます。

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

pictureBoxのサイズは299 X 204で、元の画像をpictureBoxに表示するには、

pictureBox サイズ モード = 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;
            }
        }

startPendPとして得られるのは、それぞれ( 145,2)(295,83)です。しかし、これらはpictureBoxのマウスの位置ですが、元の画像でマウスダウンとマウスダウンの実際の位置を見つけることを期待しています。( => startP: 890,1 endP: 1277,879 )

元のイメージで startP-endP の実際の場所を取得するにはどうすればよいですか?

4

2 に答える 2

4

あなたの数学は少し間違っていると思います。1278 x 958 の画像を 299 ピクセル幅に縮小するには、すべてを1278 / 2994.27 で割る必要があります。縦横比を同じに保つには、幅を224958 / 4.27に丸める必要があります。

次に、マウスのダウンとアップのイベントから座標を受け取ったら、座標に4.27を掛けて値を元の画像に拡大します。

于 2012-11-16T06:42:11.603 に答える
1

startP と endP は、画像ボックスに対するポイントですか、それとも画面に対するポイントですか? 私が覚えていることから、Locationin aMouseEventArgsは form に関連していて、あまり役に立ちません。

だから...それはおそらく次のようなものになるでしょう:

// 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 に答える