Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - vb 2010 ruotare un immagine
Forum - C# / VB.NET - vb 2010 ruotare un immagine

Avatar
coyote100 (Normal User)
Rookie


Messaggi: 50
Iscritto: 22/04/2013

Segnala al moderatore
Postato alle 11:25
Martedì, 01/10/2013
devo simulare il giro di una ruota.
Questa funzione(in basso) funziona, ma il mio problema e che la ruota(picturebox), mentre ruota si sposta  a destra a sinistra, e a me servirebbe che ruotasse, ma sempre in quel punto.

Codice sorgente - presumibilmente VB.NET

  1. Private Function RotazioneBMP(ByVal BMPInput As Bitmap, ByVal angoloRotazione As Single, ByVal coloreSfondo As Brush) As Bitmap
  2.  
  3.         'Angolo di rotazione desiderato
  4.         Dim radianti As Double = angoloRotazione * Math.PI / 180
  5.  
  6.         'Dimensioni di BMPInput
  7.         Dim bmpW As Integer = BMPInput.Width
  8.         Dim bmpH As Integer = BMPInput.Height
  9.  
  10.         'Bitmap di output
  11.         'Dimensioni
  12.         Dim bmpOutW As Integer = bmpW * Math.Abs(Math.Cos(radianti)) + bmpH * Math.Abs(Math.Sin(radianti))
  13.         Dim bmpOutH As Integer = bmpH * Math.Abs(Math.Cos(radianti)) + bmpW * Math.Abs(Math.Sin(radianti))
  14.         Dim BMPOutput As New Bitmap(bmpOutW, bmpOutH)
  15.         Dim G As Graphics = Graphics.FromImage(BMPOutput)
  16.  
  17.         'Colore di sfondo per le regioni esterne
  18.         G.FillRectangle(coloreSfondo, 0, 0, bmpOutW, bmpOutH)
  19.  
  20.         'Disegno / Rotazione di BMPInput su BMPOutput
  21.         Dim M As New System.Drawing.Drawing2D.Matrix
  22.         M.RotateAt(angoloRotazione, New PointF(bmpOutW / 2, bmpOutH / 2)) 'Centro della rotazione
  23.         G.Transform = M
  24.         G.DrawImage(BMPInput, CInt((bmpOutW - BMPInput.Width) / 2), CInt((bmpOutH - BMPInput.Height) / 2))
  25.  
  26.         Return BMPOutput
  27.  
  28.     End Function
  29.  
  30.  
  31.  
  32.   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  33.         Dim percorso As String = Application.StartupPath
  34.         Dim BMP As New Bitmap(percorso & "\IMMAGINI\pp.bmp")
  35.         '  PBruora.Image.RotateFlip(RotateFlipType.Rotate90FlipXY)
  36.         ' PBruora.Invalidate()
  37.  
  38.  
  39.         PBruora.Image = RotazioneBMP(BMP, txtAngle.Text, Brushes.Red)
  40.  
  41.  
  42.  
  43.  
  44.     End Sub




Grazie

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 20:46
Martedì, 01/10/2013
Forse il centro della rotazione e' sbagliato. Prova ad usare bmpW e bmpH invece di bmpOutW e bmpOutH.


Il mio blog: https://piero.dev
PM Quote
Avatar
coyote100 (Normal User)
Rookie


Messaggi: 50
Iscritto: 22/04/2013

Segnala al moderatore
Postato alle 22:53
Martedì, 01/10/2013
Ho sostituito
Codice sorgente - presumibilmente VB.NET

  1. 'Disegno / Rotazione di BMPInput su BMPOutput
  2.         Dim M As New System.Drawing.Drawing2D.Matrix
  3.         M.RotateAt(angoloRotazione, New PointF(bmpW / 2, bmpH / 2)) 'Centro della rotazione
  4.         G.Transform = M
  5.         G.DrawImage(BMPInput, CInt((bmpOutW - BMPInput.Width) / 2), CInt((bmpOutH - BMPInput.Height) / 2))
  6.  
  7.  
  8.  PBruora.Image = RotazioneBMP(BMP, txtAngle.Text, Brushes.Red)
  9.  
  10. ---Brushes.Red....
  11. Cast non valido dalla stringa "" al tipo 'Single'.




crea il form  e va in errore

PM Quote
Avatar
vankraster (Member)
Rookie


Messaggi: 32
Iscritto: 05/11/2010

Segnala al moderatore
Postato alle 23:15
Mercoledì, 02/10/2013
Con la premessa che l'immagine della ruota che devi ruotare è quadrata posso dirti (altrimenti nulla di ciò è valido):
Secondo me la larghezza dell'immagine dopo la rotazione va calcolata così:
[pseudo-codice - C#]  
diagonale_immagine = diagonale immagine originale, quando l'immagine era ruotata di 0^, quindi lato * Radice_q(2)

if (angolo_rotazione >45)
  angolo_rotazione=angolo_rotazione % 45;

if (angolo_rotazione ==0)
larghezza_img_ruotata =larghezza_img_originale
else if ( angolo_rotazione <45 ) a
larghezza_img_ruotata = Cos(angolo) * diagonale_immagine
else if ( angolo_rotazione ==45 )
larghezza_img_ruotata = diagonale_immagine

il punto in cui devi girare l'immagine NON è: larghezza/2 e altezza/2
Difficile calcolare i punti in cui tu devi girare l'immagine, perché considera che se hai ruotato il quadrato di x gradi allora il centro del quadrato non è più larghezza_IMG / 2 e altezza_IMG/2 ma devi incrociare le 2 diagonali del quadrato e quel punto è il centro del quadrato che tu devi girare ! Incrociare le 2 diagonali NON è uguale al H/2 e W/2 !

Questo è il mio parere...

Ultima modifica effettuata da vankraster il 03/10/2013 alle 13:13
PM Quote