Come dovrei tradurre dalle coordinate dello spazio dello schermo alle coordinate dello spazio dell'immagine in un PictureBox WinForms?

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

  •  08-06-2019
  •  | 
  •  

Domanda

Ho un'applicazione che visualizza un'immagine all'interno di un Windows Form PictureBox controllo.IL SizeMode del controllo è impostato su Zoom in modo che l'immagine contenuta nel file PictureBox verrà visualizzato in modo corretto indipendentemente dalle dimensioni del file PictureBox.

Questo è ottimo per l'aspetto visivo dell'applicazione perché puoi ridimensionare la finestra come preferisci e l'immagine verrà sempre visualizzata nella posizione migliore.Sfortunatamente, devo anche gestire gli eventi di clic del mouse sulla casella dell'immagine e devo essere in grado di tradurre dalle coordinate dello spazio dello schermo alle coordinate dello spazio dell'immagine.

Sembra che sia facile tradurre dallo spazio dello schermo allo spazio di controllo, ma non vedo alcun modo ovvio per tradurre dallo spazio di controllo allo spazio dell'immagine (ad es.la coordinata dei pixel nell'immagine sorgente che è stata ridimensionata nella casella immagine).

Esiste un modo semplice per farlo o dovrei semplicemente duplicare i calcoli di ridimensionamento che utilizzano internamente per posizionare l'immagine ed eseguire la traduzione da solo?

È stato utile?

Soluzione

A seconda del ridimensionamento, il pixel dell'immagine relativa potrebbe trovarsi ovunque in un numero di pixel.Ad esempio, se l'immagine viene ridimensionata in modo significativo, il pixel 2, 10 potrebbe rappresentare 2, 10 fino a 20, 100), quindi dovrai fare i conti tu stesso e assumerti la piena responsabilità per eventuali imprecisioni!:-)

Altri suggerimenti

Ho finito per implementare semplicemente la traduzione manualmente.Il codice non è poi così male, ma mi ha fatto desiderare che fornissero direttamente il supporto.Ho potuto vedere un metodo del genere essere utile in molte circostanze diverse.

Immagino sia per questo che hanno aggiunto metodi di estensione :)

Nello pseudocodice:

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

Per ottenere la posizione dei pixel nell'immagine, devi semplicemente moltiplicare per le dimensioni effettive dei pixel dell'immagine, ma le coordinate normalizzate ti consentono di affrontare il punto della risposta originale sulla risoluzione dell'ambiguità caso per caso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top