WinForms PictureBox에서 화면 공간 좌표를 이미지 공간 좌표로 어떻게 변환해야 합니까?

StackOverflow https://stackoverflow.com/questions/2804

  •  08-06-2019
  •  | 
  •  

문제

Windows Forms 내부에 이미지를 표시하는 응용 프로그램이 있습니다. PictureBox 제어.그만큼 SizeMode 컨트롤이 다음으로 설정되었습니다. Zoom 그래서 그 안에 포함된 이미지는 PictureBox 크기에 관계없이 화면비가 올바른 방식으로 표시됩니다. PictureBox.

원하는 대로 창 크기를 조정할 수 있고 이미지가 항상 가장 잘 맞는 방식으로 표시되므로 응용 프로그램의 시각적 모양에 매우 좋습니다.불행하게도 그림 상자에서 마우스 클릭 이벤트도 처리해야 하며 화면 공간 좌표를 이미지 공간 좌표로 변환할 수 있어야 합니다.

화면 공간에서 제어 공간으로 변환하는 것은 쉬운 것처럼 보이지만 제어 공간에서 이미지 공간으로 변환하는 확실한 방법은 없습니다(예:그림 상자에서 크기가 조정된 소스 이미지의 픽셀 좌표).

이를 수행하는 쉬운 방법이 있습니까? 아니면 이미지 위치를 지정하고 직접 번역하기 위해 내부적으로 사용하는 스케일링 수학을 복제해야 합니까?

도움이 되었습니까?

해결책

크기 조정에 따라 상대 이미지 픽셀은 여러 픽셀의 어느 위치에나 있을 수 있습니다.예를 들어 이미지가 크게 축소된 경우 픽셀 2, 10은 2, 10을 최대 20, 100까지 나타낼 수 있으므로 계산을 직접 수행해야 하며 부정확한 내용에 대해 전적인 책임을 져야 합니다!:-)

다른 팁

결국 번역을 수동으로 구현하게 되었습니다.코드가 그다지 나쁘지는 않지만 직접 지원을 제공했으면 좋겠다는 생각이 들었습니다.나는 그러한 방법이 다양한 상황에서 유용하다는 것을 알았습니다.

그래서 확장 메소드를 추가한 것 같아요 :)

의사코드에서:

// 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)

이미지의 픽셀 위치를 얻으려면 실제 이미지 픽셀 크기를 곱하면 되지만 정규화된 좌표를 사용하면 사례별로 모호성을 해결하는 원래 응답자의 요점을 해결할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top