2008-08-05 37 views
13

Tôi có một ứng dụng hiển thị hình ảnh bên trong điều khiển của Windows Forms PictureBox. Điều khiển SizeMode của điều khiển được đặt thành Zoom sao cho hình ảnh có trong PictureBox sẽ được hiển thị theo cách chính xác theo khía cạnh bất kể kích thước của PictureBox.Tôi nên dịch như thế nào từ các tọa độ không gian màn hình sang tọa độ không gian hình ảnh trong một hộp hình WinForms?

Điều này thật tuyệt vời cho giao diện trực quan của ứng dụng vì bạn có thể kích thước cửa sổ theo ý muốn và hình ảnh sẽ luôn được hiển thị bằng cách phù hợp nhất. Thật không may, tôi cũng cần phải xử lý các sự kiện nhấp chuột trên hộp hình ảnh và cần phải dịch từ tọa độ không gian màn hình sang tọa độ không gian hình ảnh. Có vẻ như nó dễ dịch từ không gian màn hình để kiểm soát không gian, nhưng tôi không thấy bất kỳ cách rõ ràng nào để dịch từ không gian điều khiển sang không gian hình ảnh (tức là tọa độ pixel trong hình ảnh nguồn đã được thu nhỏ trong hộp hình ảnh).

Có cách nào dễ dàng để thực hiện việc này hay tôi chỉ cần sao chép phép tính tỷ lệ mà chúng đang sử dụng nội bộ để định vị hình ảnh và tự dịch?

Trả lời

1

Tùy thuộc vào tỷ lệ, pixel hình ảnh tương đối có thể ở bất kỳ đâu trong một số pixel. Ví dụ: nếu hình ảnh được thu nhỏ đáng kể, pixel 2, 10 có thể đại diện cho 2, 10 tất cả lên tới 20, 100), vì vậy bạn sẽ phải tự mình làm toán và chịu trách nhiệm hoàn toàn về bất kỳ sự thiếu chính xác nào! :-)

6

Tôi chỉ cập nhật bản dịch bằng tay. Mã không quá tệ, nhưng nó đã khiến tôi ước rằng họ đã hỗ trợ trực tiếp cho nó. Tôi có thể thấy một phương pháp như vậy có ích trong nhiều hoàn cảnh khác nhau.

Tôi đoán đó là lý do tại sao họ đã thêm vào phương pháp khuyến nông :)

Trong giả:

// Recompute the image scaling the zoom mode uses to fit the image on screen 
imageScale ::= min(pictureBox.width/image.width, pictureBox.height/image.height) 

scaledWidth ::= image.width * imageScale 
scaledHeight ::= image.height * imageScale 

// Compute the offset of the image to center it in the picture box 
imageX ::= (pictureBox.width - scaledWidth)/2 
imageY ::= (pictureBox.height - scaledHeight)/2 

// Test the coordinate in the picture box against the image bounds 
if pos.x < imageX or imageX + scaledWidth < pos.x then return null 
if pos.y < imageY or imageY + scaledHeight < pos.y then return null 

// Compute the normalized (0..1) coordinates in image space 
u ::= (pos.x - imageX)/imageScale 
v ::= (pos.y - imageY)/imageScale 
return (u, v) 

Để có được vị trí điểm ảnh trong hình ảnh, bạn chỉ muốn nhân với kích thước hình ảnh điểm ảnh thực tế, nhưng các tọa độ chuẩn hóa cho phép bạn giải quyết điểm của người trả lời ban đầu về giải quyết sự mơ hồ trên cơ sở từng trường hợp cụ thể.

+1

Xin chào, thật tuyệt vời khi xem mẫu mã bạn đã đặt cùng nhau nếu bạn vẫn có nó. –

+1

Điều chắc chắn, tôi đã chỉnh sửa nó thành phản hồi của tôi – fastcall

Các vấn đề liên quan