Differenze tra le versioni di "Ruotare una immagine sul proprio asse centrale"
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 del Metodo ".Rotate()" della Classe Image== | ||
+ | Innanzitutto si potrà utilizzare una ''PictureBox'' e il Metodo ".Rotate()" della Classe "Image": | ||
+ | '''Public''' Sub Button1_Click() | ||
+ | |||
+ | Dim r As Short | ||
+ | |||
+ | While True | ||
+ | With PictureBox1 | ||
+ | .Image = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>") | ||
+ | .Alignment = Align.Center | ||
+ | .W = PictureBox1.Image.W | ||
+ | .H = PictureBox1.Image.H | ||
+ | .Image = .Image.Rotate(Rad(r)) | ||
+ | End With | ||
+ | Wait 0.001 | ||
+ | Inc r | ||
+ | Wend | ||
+ | |||
+ | '''End''' | ||
==Uso di una ''PictureBox'' e di un Contenitore ''HSplit''== | ==Uso di una ''PictureBox'' e di un Contenitore ''HSplit''== | ||
− | + | Un'altra modalità prevede ancora l'uso di una ''PictureBox'' e di un Contenitore ''HSplit''. | |
Mostriamo un semplice e pratico esempio: | Mostriamo un semplice e pratico esempio: | ||
Riga 204: | Riga 224: | ||
'''End''' | '''End''' | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Versione delle 07:14, 28 apr 2021
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à.
Indice
Uso del Metodo ".Rotate()" della Classe Image
Innanzitutto si potrà utilizzare una PictureBox e il Metodo ".Rotate()" della Classe "Image":
Public Sub Button1_Click() Dim r As Short While True With PictureBox1 .Image = Image.Load("/percorso/del/file/immagine") .Alignment = Align.Center .W = PictureBox1.Image.W .H = PictureBox1.Image.H .Image = .Image.Rotate(Rad(r)) End With Wait 0.001 Inc r Wend End
Uso di una PictureBox e di un Contenitore HSplit
Un'altra modalità prevede ancora 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
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 .