Curvare la linea di testo in un oggetto Image

Da Gambas-it.org - Wikipedia.
Versione del 25 dic 2019 alle 10:00 di Vuott (Discussione | contributi) (Creata pagina con "Una prima soluzione per ottenere un testo curvato lungo una ideale circonferenza, potrebbe essere quella di creare tante piccoli oggetti di tipo ''Image'' per quante sono le l...")

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

Una prima soluzione per ottenere un testo curvato lungo una ideale circonferenza, potrebbe essere quella di creare tante piccoli oggetti di tipo Image per quante sono le lettere alfabetiche o le sillabe.
Ciascuna lettera o sillaba verrebbe quindi disegnata in uno di quegli oggetti Image.
Infine tali oggetti Image verrebbero adeguatamente ruotati in modo perpendicolare al raggio della circonferenza (o dell'arco) e disegnati/fusi in un Oggetto Image principale più grande, per formare il testo completo e apparentemente curvato.

Mostriamo un esempio pratico:

Public Sub Form_Open()
 
 Dim im, i As Image
 Dim b As Byte
 Dim x, y, x_a, y_o, r As Short
 Dim an As Float
 Dim cl As Integer
 Dim bb As New Byte[]
 Dim fo As Font
 Dim s As String
 
 With Me
   .Center
   .W = 600
   .H = 600
 End With
 
 x_a = 260   ' Rappresenta la distanza X dal punto 0 (angolo in alto a sinistra) dell'Image principale
 y_o = 260   ' Rappresenta la distanza Y dal punto 0 (angolo in alto a sinistra) dell'Image principale
 r = 150     ' Rappresenta la lunghezza del raggio (la distanza di ogni immagine-lettera dal centro)
 
' Impone il testo da disegnare.
' Carica ogni carattere del testo In un vettore Byte[] per poter estrarre di ciascuno il valore:
 bb = bb.FromString("È lì giù che saprò se vivrà.")
 
' Imposta il colore di partenza:
 cl = Color.Blue
' Imposta il punto (sulla base dei gradi) della circonferenza da dove cominciare (in senso orario) a disegnare le lettere:
 an += 204.0
 
' Crea l'Oggetto "Image" principale, ove saranno mostrate tutte le lettere alfabetiche del testo:
 im = New Image(Me.W, Me.H, Color.White, gb.Standard)
 
 For b = 0 To bb.Max
   
' Verifica se il carattere è accentato (carattere ASCII speciale):
   If bb[b] > 127 Then
' Se è un carattere accentato, per riottenerlo nell'Image, combina i due valori che lo compongono:
     s = Chr(bb[b]) & Chr(bb[b + 1])
     Inc b
   Else
     s = Chr(bb[b])
   Endif
   
' Definisce le dimensioni dell'immagine, che conterrà la lettera alfabetica, dalle specificità del carattere:
   With fo = New Font
     .Name = "FreeSans"
     .Size = 18
' Crea un oggetto "Image" per contenere il disegno di una lettera alfabetica:
     i = New Image(.TextWidth(s) + 4, .TextHeight(s) + 4, Color.Transparent, gb.Standard)
   End With
   
   With Paint
     .Begin(i)
     .Font.Size = 18
     .Font.Name = "FreeSans"
     .Brush = .Color(cl)
     .Text(s, 1, 1, i.W, i.H, Align.Center)
     .Fill
     .End
   End With
   
   i = i.Rotate(Rad(an + 90))
 
   x = x_a + r * Cos(Rad(an)) 
   y = y_o + r * Sin(Rad(an))
   With Paint
     .Begin(im)
     .DrawImage(i, x, y, i.W, i.H)
     .End
   End With
' Imposta la distanza dei caratteri fra essi:
   an += 5.0
   
   cl += 668457
 Next
   
 With PictureBox1
   .X = 0
   .Y = 0
   .W = Me.W
   .H = Me.H
   .Image = im
 End With
 
End