2012-05-06 13 views
7

Ho bisogno della posizione precisa del mio puntatore del mouse su un PictureBox.Come recuperare il fattore di zoom di un PictureBox di WinForms?

Uso l'evento MouseMove di PictureBox.

Su questo PictureBox, utilizzo la proprietà "zoom" per mostrare un'immagine.

Qual è il modo corretto per ottenere la posizione del mouse sull'immagine originale (senza zoom)?

C'è un modo per trovare il fattore di scala e usarlo?

Penso che sia necessario utilizzare imageOriginalSize/imageShowedSize per recuperare questo fattore di scala.

Io uso questa funzione:

float scaleFactorX = mypic.ClientSize.Width/mypic.Image.Size.Width; 
float scaleFactorY = mypic.ClientSize.Height/mypic.Image.Size.Height; 

È possibile utilizzare questo valore per ottenere la corretta posizione del cursore sopra l'immagine?

+0

Suppongo di poter provare: Point cursorPosition = mypic.PointToClient (Cursor.Position); Point positionOverImage = new Point (cursorPosition.X/scaleFactorX, cursorPosition.Y/scaleFactorY) ;. Tuttavia, suppongo che ci possano essere alcuni problemi con precisione quando si calcola il fattore di zoom usando questo metodo. Ti suggerirei di ridimensionare l'immagine da solo. –

+0

grazie, ma non funziona.posizione non è corretta, ottengo lo stesso valore quando si utilizza la posizione pointtoclient e eventmouseargs. – devilkkw

+0

Si prega di inviare il frammento di codice calcolando le coordinate che si stanno attualmente utilizzando. –

risposta

6

Ho dovuto risolvere questo stesso problema oggi. Volevo che funzionasse per immagini di qualsiasi larghezza: rapporto altezza.

Ecco il mio metodo per trovare il punto "unscaled_p" sull'immagine originale a dimensione intera.

  Point p = pictureBox1.PointToClient(Cursor.Position); 
      Point unscaled_p = new Point(); 

      // image and container dimensions 
      int w_i = pictureBox1.Image.Width; 
      int h_i = pictureBox1.Image.Height; 
      int w_c = pictureBox1.Width; 
      int h_c = pictureBox1.Height; 

Il primo trucco è quello di determinare se l'immagine è un parente orizzontalmente o verticalmente più grande per il contenitore, in modo da sapere quale immagine dimensione riempie completamente il contenitore.

  float imageRatio = w_i/(float)h_i; // image W:H ratio 
      float containerRatio = w_c/(float)h_c; // container W:H ratio 

      if (imageRatio >= containerRatio) 
      { 
       // horizontal image 
       float scaleFactor = w_c/(float)w_i; 
       float scaledHeight = h_i * scaleFactor; 
       // calculate gap between top of container and top of image 
       float filler = Math.Abs(h_c - scaledHeight)/2; 
       unscaled_p.X = (int)(p.X/scaleFactor); 
       unscaled_p.Y = (int)((p.Y - filler)/scaleFactor); 
      } 
      else 
      { 
       // vertical image 
       float scaleFactor = h_c/(float)h_i; 
       float scaledWidth = w_i * scaleFactor; 
       float filler = Math.Abs(w_c - scaledWidth)/2; 
       unscaled_p.X = (int)((p.X - filler)/scaleFactor); 
       unscaled_p.Y = (int)(p.Y/scaleFactor); 
      } 

      return unscaled_p; 

Si noti che a causa dello zoom centra l'immagine, la lunghezza 'filler' deve essere presi in considerazione per determinare la dimensione che non è compilato dall'immagine. Il risultato, 'unscaled_p', è il punto sull'immagine non graduata a cui 'p' è correlato.

Spero che questo aiuti!

+1

Perfetto su un piccolo errore: per il rapporto non è necessario utilizzare la larghezza e l'altezza del controllo completo, ma la larghezza e l'altezza di Control.ClientSize, quindi senza bordi. Molto spesso la differenza non è evidente, finché non mostri un bordo e fai alcuni calcoli. Vedrai che mancano alcuni pixel –

1

Se vi ho capito bene io credo che si vorrebbe fare qualcosa di questa natura:

Ipotesi: il PictureBox si adatta all'immagine larghezza/altezza, non c'è spazio tra il bordo del controllo PictureBox e il immagine reale.

ratioX = e.X/pictureBox.ClientSize.Width; 
ratioY = e.Y/pictureBox.ClientSize.Height; 

imageX = image.Width * ratioX; 
imageY = image.Height * ratioY; 

questo dovrebbe darvi i punti del pixel nell'immagine originale.

+0

non funziona, ma mi da valore 0 sempre. – devilkkw

+0

Ho perso il '(float)' per il rapporto, fatelo, al momento se avete detto 'var ratioX', allora sarà probabilmente un' int', che significa che 'ratioX/Y' sarà sempre zero. –