Rotazione di una foto utilizzando la posizione del mouse in C #
-
23-09-2019 - |
Domanda
Fondamentalmente quello che sto cercando di fare è di avere un quadro ruotare utilizzando gli eventi del mouse. Ad esempio, mentre si tiene premuto il tasto sinistro del mouse, l'immagine ruota quando si sposta il mouse su e giù. Ho trovato un'altra domanda qui quasi come il mio ( Come posso ruotare un'immagine in C # ), ma quando la mappatura del parametro angolare nel metodo rotate (metodo di codice sorgente in link) per l'angolo calcolato tra il mouse e il centro dell'immagine ottengo un'eccezione di overflow gettato. L'immagine che sto cercando di rotazione si trova in una casella di immagine. Qualche idea? Dovrei fare in un altro modo?
Grazie in anticipo!
--------- ----------- EDIT 1
Ok penso che il mio trig era spento, l'ho cambiato in ...
= Angolo Atan ((mousePosY - imageCenterY) / (mousePosX - imageCenterX)
Ma ora l'immagine non ruota, si muove solo (ho programmato la possibilità per di muoversi come bene, ma che funziona bene). Ecco il pezzo di codice ho a che fare.
private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
isDragging = true;
pbCurrentX = e.X;
pbCurrentY = e.Y;
}
private void pictureBox_MouseMove(object sender, MouseEventArgs e)
{
// For moving the image
if (isDragging)
{
this.pictureBox1.Top = this.pictureBox1.Top + (e.Y - pbCurrentY);
this.pictureBox1.Left = this.pictureBox1.Left + (e.X - pbCurrentX);
}
// For rotating the image
if (rotateMode && isDragging)
{
y2 = e.Y;
y1 = (this.pictureBox1.Location.Y + (this.pictureBox1.Height / 2));
x2 = e.X;
x1 = (this.pictureBox1.Location.X + (this.pictureBox1.Width / 2));
angle = (float)Math.Atan((y2-y1)/(x2-x1));
// RotateImage method from the other question linked above
this.pictureBox1.Image = RotateImage(this.pictureBox1.Image, angle);
}
}
Il flag rotateMode è impostata su true quando il pictureBox è doppio clic. Grazie a tutti!
--------- ----------- RISPOSTA
Grazie a Gabe ho trovato tutti i piccoli nodi nel mio codice e funziona bene ora. L'unica cosa è che ho avuto per ridurre le dimensioni dell'immagine scatola più grande per adattare l'immagine ruotata. Ecco il codice corretto per tutti coloro che vogliono conoscere la risposta.
private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
isDragging = true;
pbCurrentX = e.X;
pbCurrentY = e.Y;
}
private void pictureBox_MouseMove(object sender, MouseEventArgs e)
{
if (isDragging && !rotateMode)
{
this.pictureBox1.Top = this.pictureBox1.Top + (e.Y - pbCurrentY);
this.pictureBox1.Left = this.pictureBox1.Left + (e.X - pbCurrentX);
}
if (rotateMode && isDragging)
{
y2 = e.Y;
y1 = (this.pictureBox1.Location.Y + (this.pictureBox1.Height / 2));
x2 = e.X;
x1 = (this.pictureBox1.Location.X + (this.pictureBox1.Width / 2));
angle = (float)Math.Atan2((y1 - y2), (x1 - x2));
pictureBox1.Image = RotateImage(currentImage, (100*angle));
}
}
private void pictureBox_MouseUp(object sender, MouseEventArgs e)
{
isDragging = false;
}
Grazie Gabe e tutti gli altri!
Soluzione
Hai provato qualcosa sulla falsariga di this.pictureBox1.Image = RotateImage(this.pictureBox1.Image, angle);
? La funzione RotateImage
si è collegato al restituito una nuova immagine ruotata invece di ruotare sul posto, come il codice si aspetta.
Purtroppo, facendo che ruota un'immagine già ruotata. Quello che dovete fare è avere l'immagine originale memorizzati da qualche parte, dire originalImage
. Poi hanno this.pictureBox1.Image = RotateImage(originalImage, angle);
. In questo modo esso ruota sempre una versione aggiornata dell'originale.
Altri suggerimenti
Senza vedere il codice, possiamo solo immaginare. La mia ipotesi è che si sta facendo un certo tipo di calcolo trig, come ad esempio:
theta = Math.Atan((y2 - y1) / (x2 - x1));
Se il tuo x2-x1 va verso 0, il tuo argomento di Math.atan va verso l'infinito, e overflow.
= Angolo Atan ((mousePosY - imageCenterY) / (mousePosX - imageCenterY)
Si utilizza imageCenterY
due volte lì, (anche se il suo ok nel codice che avete inviato).
Comunque io suggerirei di usare ATAN2 piuttosto di Atan.