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, mantenendo in modo costante e coerente la sua distanza dal ''Controllo'' che contiene l'<I>oggetto</i> "Immagine" (''isometria diretta''), utilizziamo le risorse delle Classi ''Paint'' e ''PaintBrush'' |[[#Note|1]]| e poniamo sul ''Form'' una ''DrawingArea''.
+
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à.
 +
 
 +
 
 +
==Uso della DrawingArea==
 +
Con questa modalità utilizziamo le risorse delle Classi ''Paint'' e ''PaintBrush'' |[[#Note|1]]| e poniamo sul ''Form'' una ''DrawingArea''.
  
 
La rotazione dell'immagine viene esercitata dal metodo
 
La rotazione dell'immagine viene esercitata dal metodo
Riga 44: Riga 48:
 
   End With
 
   End With
 
    
 
    
 +
'''End'''
 +
 +
 +
==Uso di una 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("''/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'''
 
  '''End'''
  

Versione delle 03:03, 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 di una 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 .