2012-11-16 264 views
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

我覺得你的數學是有點過。如果您有1278 x 958的圖像,並且想要將其縮小到299像素寬,則需要將所有內容除以1278/2994.27。要保持寬高比相同,寬度將需要爲958/4.27,其輪數爲。

然後,當您從鼠標向下接收座標時,只需將座標乘以4.27即可將值放大到原始圖像。

+0

這是如此整潔,如果我保留我的pictureSize模式在stretchImage它仍然可以嗎? –

+0

大衛告訴我的一些補充。寬度的倍數是:4.27,高度是4.69 – Sivaraman

1

startP和endP是相對於你的圖片框還是相對於屏幕的點?從我記得,LocationMouseEventArgs是相對於形式,這是不是很有用。

所以......這將可能最終是這樣的:

// 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); 
+0

好吧,事件呈現的圖片框區域,所以它是相對於圖片框 –

+0

然後,只是跳過第一行,並使用最後一個事件數據。 – LightStriker