Differenze tra le versioni di "Ruotare una immagine sul proprio asse centrale"

Da Gambas-it.org - Wikipedia.
Riga 51: Riga 51:
  
  
==Uso di una PictureBox==
+
==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''.
 
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()
 
  '''Public''' Sub Form_Open()

Versione delle 03:05, 21 nov 2014

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("/pecorso/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 .