View Full Version : [ Vb.Net 2008 ] Ruotare Immagini di X Gradi - Genymus
Salve, dovrei ruotare un'immagine di un grado ogni volta che viene premuto un bottone e con un'altro pulsante portarla a gradi 30.
è possibile?
Genymus
Ps: Ho già provato:
PictureBox.Image.RotateFlip(Rotate90FlipNone)
PictureBox.Refresh
Ma mi ruota solo di 90 o 180 °
Grazie
Per poter ruotare un oggetto grafico di X gradi a piacere, bisogna per forza scomodare le GDI+, inoltre con l'utilissima classe System.Drawing.Drawing2D.Matrix, posso applicare trasformazioni geometriche, inclusa la rotazione attorno ad un punto di coordinate opportune ( nel mio caso, il centro del parallelogramma-immagine ).
Sul Web ci sono vari esempi di gente che ha risolto il problema con un autentico "fiume di codice" ( rotazione, una bella dose di trigonometria, e poi definizione caso per caso dei vertici ( PointF ) del disegno... :doh: ).
La mia soluzione è invece questa, spero sarai in grado di apprezzarla ( :D ) :
> Una Function, che riceve in ingresso la bitmap che si desidera ruotare, l'angolo, il colore da dare alle regioni esterne che si vengono ovviamente a creare a causa della rotazione, e produce in uscita la nuova Bmp ruotata, che chiaramente sarà più grande di quella originale.
La Function inoltre non fa nessun uso "furbo" di oggetti dell'interfaccia grafica WinForms, come PictureBox ecc... :
Private Function RotazioneBMP(ByVal BMPInput As Bitmap, ByVal angoloRotazione As Single, ByVal coloreSfondo As Brush) As Bitmap
'Angolo di rotazione desiderato
Dim radianti As Double = angoloRotazione * Math.PI / 180
'Dimensioni di BMPInput
Dim bmpW As Integer = BMPInput.Width
Dim bmpH As Integer = BMPInput.Height
'Bitmap di output
'Dimensioni
Dim bmpOutW As Integer = bmpW * Math.Abs(Math.Cos(radianti)) + bmpH * Math.Abs(Math.Sin(radianti))
Dim bmpOutH As Integer = bmpH * Math.Abs(Math.Cos(radianti)) + bmpW * Math.Abs(Math.Sin(radianti))
Dim BMPOutput As New Bitmap(bmpOutW, bmpOutH)
Dim G As Graphics = Graphics.FromImage(BMPOutput)
'Colore di sfondo per le regioni esterne
G.FillRectangle(coloreSfondo, 0, 0, bmpOutW, bmpOutH)
'Disegno / Rotazione di BMPInput su BMPOutput
Dim M As New System.Drawing.Drawing2D.Matrix
M.RotateAt(angoloRotazione, New PointF(bmpOutW / 2, bmpOutH / 2)) 'Centro della rotazione
G.Transform = M
G.DrawImage(BMPInput, CInt((bmpOutW - BMPInput.Width) / 2), CInt((bmpOutH - BMPInput.Height) / 2))
Return BMPOutput
End Function
> Con l'aiuto di una PictureBox e di un NumericUpDown ( da 0 a 360 ) posso visualizzare i risultati delle rotazioni :
Private Sub nup_angolo_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nup_angolo.ValueChanged
PictureBox1.Image = RotazioneBMP(BMP, nup_angolo.Value, Brushes.Red)
End Sub
BMP è la Bitmap in ingresso, che creo una volta sola a livello di Form :
Private BMP As New Bitmap(percorso & "test.bmp")
E direi che il gioco è fatto ! ;)
Grazie...
Una Domanda... dovrei ruotare un'immagine sopra un'altra... e ho bisogno quindi che questa sia png per lo sfondo trasparente...
il codice che mi ha dato può usare anche png?
Grazie
Genymus
Grazie...
Una Domanda... dovrei ruotare un'immagine sopra un'altra... e ho bisogno quindi che questa sia png per lo sfondo trasparente...
il codice che mi ha dato può usare anche png?
Grazie
Genymus
Sì, supporta pienamente anche immagini .Png, .Jpg, .Gif ecc... ;)
Lei mi salva la vita...
Appena possibile entro in windows e provo...
Grazie e Buona Domenica
Genymus
Lei mi salva la vita...
Appena possibile entro in windows e provo...
Grazie e Buona Domenica
Genymus
Ma... Mi dai del Lei ? :D
Pensavo fosse regola ormai universale di darsi sempre e cmq del TU, nei Forum... ;)
mi scuso... do sempre del lei a chiunque, mi hanno educato in questo modo.
Pensavo fosse regola ormai universale di darsi sempre e cmq del TU, nei Forum...
Non lo sapevo... grazie per il cosiglio.
Genymus
mi scuso... do sempre del lei a chiunque, mi hanno educato in questo modo.
Non lo sapevo... grazie per il cosiglio.
Genymus
Nessun problema, figurati, era solo per dire... :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.