Hvordan skal jeg oversette fra skjermplass koordinatene til bilderommet koordinater i et WinForms PictureBox?

stemmer
13

Jeg har et program som viser et bilde inne i en Windows Forms PictureBoxkontroll. Den SizeModeav styre er satt til Zoom, slik at bildet som inneholdes i det PictureBoxvil bli vist i et sideriktig måte, uavhengig av dimensjonene på PictureBox.

Dette er flott for det visuelle inntrykket av programmet fordi du kan størrelsen på vinduet slik du vil, og bildet vil alltid vises ved hjelp av sin beste form. Dessverre, jeg må også håndtere museklikk hendelser på bildeblokken og må være i stand til å oversette fra skjermen-space-koordinatene til bilde plass koordinater.

Det ser ut som det er lett å oversette fra skjermplass til å kontrollere plass, men jeg kan ikke se noen åpenbar måte å oversette fra kontrollen plass til bilderommet (dvs. pixel koordinere i kildebildet som er skalert i bildeblokk).

Er det en enkel måte å gjøre dette på, eller skal jeg bare kopiere skalering matte som de bruker internt for å plassere bildet og gjøre oversettelsen meg selv?

Publisert på 05/08/2008 klokken 20:28
kilden bruker
På andre språk...                            


2 svar

stemmer
6

Jeg endte opp med bare å implementere oversettelsen manuelt. Koden er ikke så ille, men det la meg ønske at de ga støtte til det direkte. Jeg kunne se en slik metode være nyttig i mange forskjellige situasjoner.

Jeg tror det er derfor de lagt skjøtemetoder :)

I pseudokode:

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

For å få pixel posisjon i bildet, vil du bare multiplisere med den faktiske bildepunktdimensjoner, men de normaliserte koordinatene tillate deg å ta det opprinnelige responder synspunkt om å løse tvetydigheten fra sak til sak.

Svarte 06/08/2008 kl. 04:25
kilden bruker

stemmer
1

Avhengig av skalering, kan den relative bildet pixel være hvor som helst i et antall piksler. For eksempel, hvis bildet er skalert ned betraktelig, kan pixel 2, 10 representerer to, 10 og helt opp til 20, 100), så du må gjøre regnestykket selv og ta det fulle ansvar for eventuelle feil! :-)

Svarte 05/08/2008 kl. 20:33
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more