2012-05-06 74 views
7

Tôi cần vị trí chính xác của con trỏ chuột trên PictureBox.Làm thế nào để lấy lại hệ số zoom của một PictureBox của WinForms?

Tôi sử dụng sự kiện MouseMove của PictureBox.

Trên PictureBox này, tôi sử dụng thuộc tính "thu phóng" để hiển thị hình ảnh.

Cách chính xác để nhận vị trí của con chuột trên hình ảnh gốc (chưa được hiển thị) là gì?

Có cách nào để tìm yếu tố tỷ lệ và sử dụng không?

Tôi nghĩ cần phải sử dụng imageOriginalSize/imageShowedSize để truy lục yếu tố tỷ lệ này.

tôi sử dụng chức năng này:

float scaleFactorX = mypic.ClientSize.Width/mypic.Image.Size.Width; 
float scaleFactorY = mypic.ClientSize.Height/mypic.Image.Size.Height; 

là có thể sử dụng giá trị này để có được đúng vị trí của con trỏ lên ảnh?

+0

Tôi cho rằng bạn có thể thử: Point cursorPosition = mypic.PointToClient (Cursor.Position); Vị trí điểmOverImage = điểm mới (cursorPosition.X/scaleFactorX, cursorPosition.Y/scaleFactorY) ;. Tuy nhiên, tôi cho rằng có thể có một số vấn đề với độ chính xác khi bạn đếm hệ số thu phóng bằng phương pháp này. Tôi khuyên bạn nên tự mở rộng hình ảnh. –

+0

cảm ơn, nhưng không hoạt động. Vị trí là không chính xác, tôi nhận được cùng một giá trị khi sử dụng vị trí pointtoclient và eventmouseargs. – devilkkw

+0

Vui lòng đăng đoạn mã tính toán tọa độ mà bạn hiện đang sử dụng. –

Trả lời

6

Tôi phải giải quyết cùng một vấn đề này ngay hôm nay. Tôi muốn nó hoạt động với các hình ảnh có tỷ lệ chiều rộng: chiều cao bất kỳ.

Đây là phương pháp của tôi để tìm điểm 'unscaled_p' trên hình ảnh có kích thước đầy đủ gốc.

  Point p = pictureBox1.PointToClient(Cursor.Position); 
      Point unscaled_p = new Point(); 

      // image and container dimensions 
      int w_i = pictureBox1.Image.Width; 
      int h_i = pictureBox1.Image.Height; 
      int w_c = pictureBox1.Width; 
      int h_c = pictureBox1.Height; 

Bí quyết đầu tiên là xác định hình ảnh có chiều rộng theo chiều ngang hoặc chiều dọc lớn hơn so với vùng chứa, vì vậy bạn sẽ biết kích thước hình ảnh nào lấp đầy hoàn toàn vùng chứa.

  float imageRatio = w_i/(float)h_i; // image W:H ratio 
      float containerRatio = w_c/(float)h_c; // container W:H ratio 

      if (imageRatio >= containerRatio) 
      { 
       // horizontal image 
       float scaleFactor = w_c/(float)w_i; 
       float scaledHeight = h_i * scaleFactor; 
       // calculate gap between top of container and top of image 
       float filler = Math.Abs(h_c - scaledHeight)/2; 
       unscaled_p.X = (int)(p.X/scaleFactor); 
       unscaled_p.Y = (int)((p.Y - filler)/scaleFactor); 
      } 
      else 
      { 
       // vertical image 
       float scaleFactor = h_c/(float)h_i; 
       float scaledWidth = w_i * scaleFactor; 
       float filler = Math.Abs(w_c - scaledWidth)/2; 
       unscaled_p.X = (int)((p.X - filler)/scaleFactor); 
       unscaled_p.Y = (int)(p.Y/scaleFactor); 
      } 

      return unscaled_p; 

Lưu ý rằng vì thu phóng trung tâm hình ảnh, độ dài 'phụ' phải được xác định để xác định thứ nguyên không được lấp đầy bởi hình ảnh. Kết quả, 'unscaled_p', là điểm trên hình ảnh chưa được đánh số mà 'p' tương quan.

Hy vọng điều đó sẽ hữu ích!

+1

Hoàn hảo khi có một lỗi nhỏ: đối với tỷ lệ bạn không nên sử dụng chiều rộng và chiều cao của điều khiển hoàn chỉnh, nhưng chiều rộng và chiều cao của Control.ClientSize, do đó không có đường viền. Khá thường xuyên sự khác biệt là không đáng chú ý, cho đến khi bạn hiển thị một biên giới và làm một số tính toán. Bạn sẽ thấy một số điểm ảnh bị thiếu –

1

Nếu tôi đã hiểu bạn một cách chính xác Tôi tin rằng bạn sẽ muốn làm một cái gì đó của thiên nhiên này:

Assumption: PictureBox phù hợp với hình ảnh chiều rộng/chiều cao, không có khoảng trống giữa biên giới của PictureBox và hình ảnh thực tế.

ratioX = e.X/pictureBox.ClientSize.Width; 
ratioY = e.Y/pictureBox.ClientSize.Height; 

imageX = image.Width * ratioX; 
imageY = image.Height * ratioY; 

điều này sẽ cung cấp cho bạn điểm ot pixel trong hình ảnh gốc.

+0

doesen't works.its cho tôi giá trị 0 bao giờ hết. – devilkkw

+0

Tôi bỏ lỡ '(float)' cho tỷ lệ, làm điều đó, tại thời điểm này nếu bạn nói có 'var ratioX', thì nó có thể là' int', có nghĩa là 'ratioX/Y' sẽ luôn bằng không. –