c# - tradurre - traduttore inglese italiano




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

Ho un'applicazione che visualizza un'immagine all'interno di un controllo PictureBox Windows Form. Il SizeMode del controllo è impostato su Zoom modo che l'immagine contenuta nel PictureBox venga visualizzata in modo corretto rispetto all'aspetto indipendentemente dalle dimensioni del PictureBox .

Questo è ottimo per l'aspetto visivo dell'applicazione perché è possibile ridimensionare la finestra come si desidera e l'immagine verrà sempre visualizzata utilizzando la sua migliore adattabilità. 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 per controllare lo spazio, ma non vedo alcun modo ovvio per tradurre dallo spazio di controllo allo spazio dell'immagine (cioè la coordinata di pixel nell'immagine sorgente che è stata ridimensionata nella finestra immagine).

C'è un modo semplice per farlo, o dovrei semplicemente duplicare la matematica di ridimensionamento che stanno usando internamente per posizionare l'immagine e fare la traduzione da solo?


Mi sono limitato a implementare la traduzione manualmente. Il codice non è male, ma mi ha lasciato desiderare di aver fornito il supporto direttamente. Potevo vedere un tale metodo essere utile in molte circostanze diverse.

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

In 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 indirizzare il punto del risponditore originale sulla risoluzione dell'ambiguità caso per caso.


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