Ruotare una immagine sul proprio asse centrale

Da Gambas-it.org - Wikipedia.

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 .