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

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
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'<I>oggetto</i> "Immagine", possiamo adottare almeno due modalità.
+
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'<I>oggetto</i> "Immagine", possiamo adottare una modalità che prevede l'uso di una ''DrawingArea''.
  
  
==Uso della DrawingArea==
 
 
Con questa modalità utilizziamo le risorse delle Classi ''Paint'' e ''PaintBrush'' |[[#Note|1]]| e poniamo sul ''Form'' una ''DrawingArea''.
 
Con questa modalità utilizziamo le risorse delle Classi ''Paint'' e ''PaintBrush'' |[[#Note|1]]| e poniamo sul ''Form'' una ''DrawingArea''.
  
Riga 48: Riga 47:
 
   End With
 
   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
 
 
<FONT Color=gray>' ''Generiamo un'immagine trasparente in questo caso grande quanto la "PictureBox":''</font>
 
  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'''
 
  '''End'''
  

Versione delle 17:07, 22 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 una modalità che prevede l'uso di una 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



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 .