Ruotare una immagine sul proprio asse centrale
Per ruotare un'immagine rigorosamente intorno al proprio asse centrale (isometria diretta), mantenendo in modo costante e coerente la sua distanza dal Controllo che contiene l'oggetto "Immagine", possiamo adottare almeno due modalità.
Uso della DrawingArea
Con questa modalità utilizziamo le risorse delle Classi Paint e PaintBrush |1| e poniamo sul Form una DrawingArea.
La rotazione dell'immagine viene esercitata dal metodo
Paint.Rotate(Rad(valore_in_gradi))
Se si intende ruotare l'immagine in senso orario, bisognerà porre valori negativi dei gradi: Paint.Rotate(Rad(-valore_in_gradi)).
Nel seguente esempio pratico, una immagine sarà ruotata di 45° in senso antiorario:
Private im As Image Public Sub Form_Open() im = Image.Load("/percorso/dell'immagine") ' Rendiamo la "DrawingArea" delle medesime dimensioni dell'immagine caricata: With DrawingArea1 .W = im.W .h = im.H End With End Public Sub DrawingArea1_Draw() Dim pb As PaintBrush With Paint ' Creiamo un oggetto "PaintBrush" mediante l'immagine caricata: pb = Paint.Image(im) pb.Scale(DrawingArea1.W / im.W, DrawingArea1.H / im.H) ' I valori associati ai parametri di questo metodo devono ' essere sempre pari alla metà della dimensione dell'immagine caricata: .Translate(125, 125) ' Ruotiamo l'immagine di 45° in senso antiorario: .Rotate(Rad(45)) .Translate(-125, -125) .Brush = pb .Rectangle(0, 0, DrawingArea1.W, DrawingArea1.H) .Fill .End End With End
Uso della PictureBox
Quest'altra modalità prevede che sul Form sia posta una PictureBox, nella quale viene creata un'immagine trasparente sufficientemente grande a contenere le dimensioni, dopo apposita trasposizione su di essa, dell'immagine che dovrà essere ruotata. La creazione di questa immagine trasparente, che farà da supporto all'immagine che dovrà ruotare, è necessaria per poter porre l'immagine da ruotare in un punto qualsiasi da noi scelto all'interno della PictureBox.
Public Sub Form_Open() Dim im, imm As Image Dim i, j As Integer Me.Show ' Generiamo un'immagine trasparente in questo caso grande quanto la "PictureBox": imm = New Image(PictureBox1.W, PictureBox1.H, &FF000000) While True Inc j im = Image.Load("/percorso/dell'immagine/da/ruotare") im = im.Rotate(Rad(j)) If j Mod 3 = 0 Then Select Case j Case 1 To 45 Inc i Case 46 To 90 Dec i Case 91 To 135 Inc i Case 136 To 180 Dec i Case 181 To 225 Inc i Case 226 To 270 Dec i Case 271 To 315 Inc i Case 316 To 360 Dec i End Select Endif imm.DrawImage(im, 100 - i, 100 - i) PictureBox1.Picture = imm.Picture Wait 0.001 If j = 361 Then j = 1 Wend End
Note
[1] L'uso combinato delle Classi Paint e PaintBrush, come nell'esempio, evita che l'oggetto Image si sposti in senso verticale e/o orizzontale durante la sua rotazione, come avviene se si utilizza semplicemente il metodo .Rotate() della Classe Image .