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 alcune 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 alcune modalità.
  
===Uso di una ''PictureBox'' e di un Contenitore ''HSplit''===
+
==Uso di una ''PictureBox'' e di un Contenitore ''HSplit''==
 
La prima modalità prevede l'uso di una ''PictureBox'' e di un Contenitore ''HSplit''.
 
La prima modalità prevede l'uso di una ''PictureBox'' e di un Contenitore ''HSplit''.
  
Riga 22: Riga 22:
 
    
 
    
 
   With pbx = New PictureBox(hs)
 
   With pbx = New PictureBox(hs)
     .Alignment = 3
+
     .Alignment = Align.Center
 
     .Expand = True
 
     .Expand = True
     .Picture = im.Picture
+
     .Image = im
 
   End With
 
   End With
 
    
 
    
 
   Do
 
   Do
 
     For s = 0 To 360
 
     For s = 0 To 360
       pbx.Picture = im.Rotate(Rad(s)).Picture
+
       pbx.Image = im.Rotate(Rad(s))
 
       Wait 0.004
 
       Wait 0.004
 
     Next
 
     Next
Riga 39: Riga 39:
  
  
 
+
==Uso di una ''DrawingArea'' e delle Classi ''Paint'' e ''PaintBrush''==
===Uso di una ''DrawingArea'' e delle Classi ''Paint'' e ''PaintBrush''===
 
 
Un'altra modalità prevede l'uso di una ''DrawingArea'' e le risorse delle Classi ''Paint'' e ''PaintBrush'' |[[#Note|1]]| e poniamo sul ''Form'' una ''DrawingArea''.
 
Un'altra modalità prevede l'uso di una ''DrawingArea'' e le risorse delle Classi ''Paint'' e ''PaintBrush'' |[[#Note|1]]| e poniamo sul ''Form'' una ''DrawingArea''.
  

Versione delle 00:11, 31 ott 2020

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 alcune modalità.

Uso di una PictureBox e di un Contenitore HSplit

La prima modalità prevede l'uso di una PictureBox e di un Contenitore HSplit.

Mostriamo un semplice e pratico esempio:

Public Sub Form_Activate()
 
 Dim im As Image
 Dim hs As HSplit
 Dim pbx As PictureBox
 Dim s As Short
 
  im = Image.Load("/percorso/del/file/immagine")
 
  With hs = New HSplit(Me)
    .X = 20
    .Y = 20
    .W = im.W
    .H = im.H
  End With
 
  With pbx = New PictureBox(hs)
    .Alignment = Align.Center
    .Expand = True
    .Image = im
  End With
  
  Do
    For s = 0 To 360
      pbx.Image = im.Rotate(Rad(s))
      Wait 0.004
    Next
  Loop
  
End

Per effettuare la rotazione al contrario la riga del ciclo "For" sarà impostata come segue:

For s = 0 To -360 Step -1


Uso di una DrawingArea e delle Classi Paint e PaintBrush

Un'altra modalità prevede l'uso di una DrawingArea e 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 di dimensioni 150x150 pixel sarà ruotata di 45° in senso antiorario:

Private im As Image


Public Sub  Form_Open()

  im = Image.Load("/percorso/del/file/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(im.W / 2, im.H / 2)
' Ruotiamo l'immagine di 45° in senso antiorario:
    .Rotate(Rad(45))
    .Translate(-im.W / 2, -im.H / 2)
    .Brush = pb
    .Rectangle(0, 0, DrawingArea1.W, DrawingArea1.H)
    .Fill
    .End
  End With
 
End


In quest'altro esempio sarà possibile ruotare un'immagine mediante uno Slider:

Private immago As Image
Private centrox As Float
Private centroy As Float

Public Sub Form_Open()
 
 Dim verticeX, verticeY As Float
 
 immago = Image.Load("' /percorso/del/file/immagine")
 
' Centra l'immagine all'interno della DrawingArea:
 verticeX = (DrawingArea1.W - immago.W) / 2
 verticeY = (DrawingArea1.H - immago.H) / 2
 
' Individua il centro dell'immagine:
 centroX = verticeX + immago.W / 2
 centroY = verticeY + immago.H / 2
 
End


Public Sub DrawingArea1_Draw()
 
 Dim hBrush As PaintBrush
 
 With hBrush = Paint.Image(immago, centroX, centroY)  
   .Rotate(Rad(Slider1.Value))    
   .Translate(immago.W / 2, immago.H / 2)
 End With
 With Paint
   .Brush = hBrush  
   .Arc(centroX, centroY, immago.W / 2)
   .Fill
 End With
 
End


Public Sub Slider1_Change()
 
 DrawingArea1.Refresh
 
End


In quest'altro esempio si potrà ruotare l'immagine di 270° mediante uno Slider o mediante la rotellina del mouse oppure mediante il puntatore del mouse tenendo premuto un tasto:

Private im As Image
Private c As Short


Public Sub Form_Open()

 Me.Show

 im = Image.Load("/percorso/del/file/immagine")

 With DrawingArea1
   .W = im.W
   .h = im.H
 End With
 
End


Public Sub DrawingArea1_Draw()

 Dim pb As PaintBrush

  With Paint
    pb = .Image(im)          
    pb.Scale(DrawingArea1.W / im.W, DrawingArea1.H / im.H)
    .Translate(im.W / 2, im.H / 2)
    .Rotate(Rad(-1 * c))
   .Translate(- im.W / 2, - im.H / 2)
   .Brush = pb
   .Rectangle(0, 0, DrawingArea1.W, DrawingArea1.H)
   .Fill
   .End
 End With

End


Public Sub Slider1_Change()

 c = Slider1.Value

 DrawingArea1.Refresh()

End


Public Sub DrawingArea1_MouseWheel()

 c = c + (1 * Mouse.Delta)
 
 Slider1.Value = c

 DrawingArea1.Refresh()
 
End


Public Sub DrawingArea1_MouseMove()

 c = 270 - (Round(270 / im.H) * Mouse.Y)
  
 If c < 0 Then c = 0
 If c > 270 Then c = 270

 Slider1.Value = c

 DrawingArea1.Refresh()

End


Esempio con altro codice

In quest'altro esempio si effettuerà ancora una volta la rotazione con un'immagine quadrata. La rotazione avverrà con sedici spostamenti ciscuno da 22,5 gradi in senso antiorario, utilizzando valori per l'aggiustamento dell'immagine riscontrati empiricamente.
Si porranno sul Form una DrawingArea, uno Slider, un ValueBox ed una TextArea:

Private im As Image
Private c As Single
Private wa As Single


Public Sub Form_Open()

 Me.Show

 Slider1.Value = 100
 ValueBox1.Value = Slider1.Value / 100
 im = Image.Load("/percorso/del/file/con/immagine/quadrata")

 With DrawingArea1
   .W = im.W
   .H = im.H
 End With

 While True
   c += 22.5
   If c > 360 Then c = 22.5
   DrawingArea1.Refresh()
   Wait wa
 Wend

End


Public Sub DrawingArea1_Draw()

 With Paint
   .Begin(DrawingArea1)
   .Rotate(Rad(c))
   Select Case c
     Case 22.5
       .DrawImage(im, (-34 * im.W) / 150, (23 * im.W) / 150)
     Case 45
       .DrawImage(im, (-75 * im.W) / 150, (32 * im.W) / 150)
     Case 67.5
       .DrawImage(im, (-115 * im.W) / 150, (23 * im.W) / 150)
     Case 90
       .DrawImage(im, (-150 * im.W) / 150, 0)
     Case 112.5
       .DrawImage(im, (-173.5 * im.W) / 150, (-34 * im.W) / 150)
     Case 135
       .DrawImage(im, (-181.5 * im.W) / 150, (-75 * im.W) / 150)
     Case 157.5
       .DrawImage(im, (-173.5 * im.W) / 150, (-115 * im.W) / 150)
     Case 180
       .DrawImage(im, (-150 * im.W) / 150, (-150 * im.W) / 150)
     Case 202.5
       .DrawImage(im, (-115 * im.W) / 150, (-173.5 * im.W) / 150)
     Case 225
       .DrawImage(im, (-75 * im.W) / 150, (-181.5 * im.W) / 150)
     Case 247.5
       .DrawImage(im, (-34 * im.W) / 150, (-173.5 * im.W) / 150)
     Case 270
       .DrawImage(im, 0, (-150 * im.W) / 150)
     Case 292.5
       .DrawImage(im, (23 * im.W) / 150, (-115 * im.W) / 150)
     Case 315
       .DrawImage(im, (32 * im.W) / 150, (-75 * im.W) / 150)
     Case 337.5
       .DrawImage(im, (23 * im.W) / 150, (-34 * im.W) / 150)
     Case 360
       .DrawImage(im, 0, 0)
   End Select
   .end
 End With
 
 TextLabel1.Text = CStr(c)

End


Public Sub Slider1_Change()

 wa = Slider1.Value / 100
 ValueBox1.Value = Slider1.Value / 100
 
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 .