PDA

View Full Version : [ Vb.Net 2008 ] Ruotare Immagini di X Gradi - Genymus


Genymus
22-05-2009, 21:09
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

Genymus
23-05-2009, 23:15
...

MarcoGG
24-05-2009, 08:40
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 ! ;)

Genymus
24-05-2009, 10:25
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

MarcoGG
24-05-2009, 11:30
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... ;)

Genymus
24-05-2009, 13:05
Lei mi salva la vita...
Appena possibile entro in windows e provo...

Grazie e Buona Domenica
Genymus

MarcoGG
24-05-2009, 17:37
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... ;)

Genymus
26-05-2009, 14:22
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

MarcoGG
28-05-2009, 12:38
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