Differenze tra le versioni di "Curvare la linea di testo in un oggetto Image"

Da Gambas-it.org - Wikipedia.
Riga 4: Riga 4:
  
 
Mostriamo un esempio pratico:
 
Mostriamo un esempio pratico:
 +
Private Const CURVATURA As Float = 8.0
 +
 +
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
    
+
   Dim im, i As Image
+
  Dim pb As PictureBox
 +
   Dim testo As String
 +
  Dim fo As Font
 +
  Dim an As Float
 +
   Dim ii As Image[]
 
   Dim b As Byte
 
   Dim b As Byte
 +
  Dim i, im As Image
 
   Dim x, y, x_a, y_o, r As Short
 
   Dim x, y, x_a, y_o, r As Short
   Dim an As Float
+
    
   Dim cl As Integer
+
   Me.Show
  Dim bb As New Byte[]
 
  Dim fo As Font
 
  Dim s As String
 
 
    
 
    
 
   With Me
 
   With Me
Riga 19: Riga 24:
 
     .W = 600
 
     .W = 600
 
     .H = 600
 
     .H = 600
 +
    .Arrangement = Arrange.Fill
 
   End With
 
   End With
 
    
 
    
   x_a = 260  <FONT Color=gray>' ''Rappresenta la distanza X dal punto 0 (angolo in alto a sinistra) dell'Image principale''</font>
+
   With pb = New PictureBox(Me)
  y_o = 260  <FONT Color=gray>' ''Rappresenta la distanza Y dal punto 0 (angolo in alto a sinistra) dell'Image principale''</font>
+
    .X = 0
   r = 150    <FONT Color=gray>' ''Rappresenta la lunghezza del raggio (la distanza di ogni immagine-lettera dal centro)''</font>
+
    .Y = 0
 +
   End With
 
    
 
    
  <FONT Color=gray>' ''Impone il testo da disegnare.''
+
  <FONT Color=gray>' ''Imposta il testo da disegnare:''</font>
' ''Carica ogni carattere del testo In un vettore Byte[] per poter estrarre di ciascuno il valore:''</font>
+
   testo = "Questo e' un testo qualsiasi"
   bb = bb.FromString("È lì giù che saprò se vivrà.")
 
 
    
 
    
<FONT Color=gray>' ''Imposta il colore di partenza:''</font>
 
  cl = Color.Blue
 
 
  <FONT Color=gray>' ''Imposta il punto (sulla base dei gradi) della circonferenza da dove cominciare (in senso orario) a disegnare le lettere:''</font>
 
  <FONT Color=gray>' ''Imposta il punto (sulla base dei gradi) della circonferenza da dove cominciare (in senso orario) a disegnare le lettere:''</font>
   an += 204.0
+
   an = 270.0
 
    
 
    
<FONT Color=gray>' ''Crea l'Oggetto "Image" principale, ove saranno mostrate tutte le lettere alfabetiche del testo:''</font>
+
   ii = New Image[]
   im = New Image(Me.W, Me.H, Color.White, gb.Standard)
 
 
    
 
    
   For b = 0 To bb.Max
+
   For b = 1 To Len(testo)
   
 
<FONT Color=gray>' ''Verifica se il carattere è accentato (carattere ASCII speciale):''</font>
 
    If bb[b] > 127 Then
 
<FONT Color=gray>' ''Se è un carattere accentato, per riottenerlo nell'Image, combina i due valori che lo compongono:''</font>
 
      s = Chr(bb[b]) & Chr(bb[b + 1])
 
      Inc b
 
    Else
 
      s = Chr(bb[b])
 
    Endif
 
   
 
 
  <FONT Color=gray>' ''Definisce le dimensioni dell'immagine, che conterrà la lettera alfabetica, dalle specificità del carattere:''</font>
 
  <FONT Color=gray>' ''Definisce le dimensioni dell'immagine, che conterrà la lettera alfabetica, dalle specificità del carattere:''</font>
 
     With fo = New Font
 
     With fo = New Font
      .Name = "FreeSans"
 
      .Size = 18
 
 
  <FONT Color=gray>' ''Crea un oggetto "Image" per contenere il disegno di una lettera alfabetica:''</font>
 
  <FONT Color=gray>' ''Crea un oggetto "Image" per contenere il disegno di una lettera alfabetica:''</font>
       i = New Image(.TextWidth(s) + 4, .TextHeight(s) + 4, Color.Transparent, gb.Standard)
+
       i = New Image(.TextWidth(Mid(testo, b, 1)), .TextHeight(Mid(testo, b, 1)), Color.Transparent, gb.Standard)
 
     End With
 
     End With
   
 
 
     With Paint
 
     With Paint
 
       .Begin(i)
 
       .Begin(i)
       .Font.Size = 18
+
       .DrawText(Mid(testo, b, 1), 0, 0, i.W, i.H, Align.Normal)
      .Font.Name = "FreeSans"
 
      .Brush = .Color(cl)
 
      .Text(s, 1, 1, i.W, i.H, Align.Center)
 
      .Fill
 
 
       .End
 
       .End
 
     End With
 
     End With
   
+
 
     i = i.Rotate(Rad(an + 90))
+
     i = i.Rotate(Rad(-an))
 +
    ii.Push(i)
 +
    an += CURVATURA
 +
  Next
 +
 
 +
  x_a = pb.W / 2    <FONT Color=gray>' ''Rappresenta la distanza X dal punto 0 (angolo in alto a sinistra) dell'Image principale''</font>
 +
  y_o = pb.H / 2    <FONT Color=gray>' ''Rappresenta la distanza Y dal punto 0 (angolo in alto a sinistra) dell'Image principale''</font>
 +
  r = 200      <FONT Color=gray>' ''Rappresenta la lunghezza del raggio (la distanza di ogni immagine-lettera dal centro)''</font>
 +
 
 +
<FONT Color=gray>' ''Crea l'Oggetto "Image" ove saranno disegnate le singole immagini dei caratteri per ricreare il testo ruotato:''</font>
 +
  im = New Image(pb.W, pb.H, Color.Yellow, gb.Standard)
 
    
 
    
 +
<FONT Color=gray>' ''Imposta il punto (sulla base dei gradi) della circonferenza da dove cominciare (in senso orario) a disegnare le singole Image nella Image "im" superficie principale:''</font>
 +
  an = 180
 +
 
 +
  For b = 0 To ii.Max
 +
<FONT Color=gray>' ''Imposta la curvatura delle singole Image dei caratteri:''</font>
 
     x = x_a + r * Cos(Rad(an))  
 
     x = x_a + r * Cos(Rad(an))  
 
     y = y_o + r * Sin(Rad(an))
 
     y = y_o + r * Sin(Rad(an))
 
     With Paint
 
     With Paint
 
       .Begin(im)
 
       .Begin(im)
       .DrawImage(i, x, y, i.W, i.H)
+
       .DrawImage(ii[b], x, y, ii[b].W, ii[b].H, 1.0, Null)
 
       .End
 
       .End
 
     End With
 
     End With
  <FONT Color=gray>' ''Imposta la distanza dei caratteri fra essi:''</font>
+
  <FONT Color=gray>' ''Imposta la distanza delle singole immagini dei caratteri fra esse:''</font>
     an += 5.0
+
     an += CURVATURA
   
 
    cl += 668457
 
 
   Next
 
   Next
   
 
  With PictureBox1
 
    .X = 0
 
    .Y = 0
 
    .W = Me.W
 
    .H = Me.H
 
    .Image = im
 
  End With
 
 
    
 
    
 +
  pb.Image = im
 +
 
  '''End'''
 
  '''End'''

Versione delle 08:48, 3 giu 2021

Una 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:

Private Const CURVATURA As Float = 8.0


Public Sub Form_Open()

 Dim pb As PictureBox
 Dim testo As String
 Dim fo As Font
 Dim an As Float
 Dim ii As Image[]
 Dim b As Byte
 Dim i, im As Image
 Dim x, y, x_a, y_o, r As Short
 
 Me.Show
 
 With Me
   .Center
   .W = 600
   .H = 600
   .Arrangement = Arrange.Fill
 End With
 
 With pb = New PictureBox(Me)
   .X = 0
   .Y = 0
 End With
 
' Imposta il testo da disegnare:
 testo = "Questo e' un testo qualsiasi"
 
' Imposta il punto (sulla base dei gradi) della circonferenza da dove cominciare (in senso orario) a disegnare le lettere:
 an = 270.0
 
 ii = New Image[]
 
 For b = 1 To Len(testo)
' Definisce le dimensioni dell'immagine, che conterrà la lettera alfabetica, dalle specificità del carattere:
   With fo = New Font
' Crea un oggetto "Image" per contenere il disegno di una lettera alfabetica:
     i = New Image(.TextWidth(Mid(testo, b, 1)), .TextHeight(Mid(testo, b, 1)), Color.Transparent, gb.Standard)
   End With
   With Paint
     .Begin(i)
     .DrawText(Mid(testo, b, 1), 0, 0, i.W, i.H, Align.Normal)
     .End
   End With
  
   i = i.Rotate(Rad(-an))
   ii.Push(i)
   an += CURVATURA
 Next 
 
 x_a = pb.W / 2    ' Rappresenta la distanza X dal punto 0 (angolo in alto a sinistra) dell'Image principale
 y_o = pb.H / 2    ' Rappresenta la distanza Y dal punto 0 (angolo in alto a sinistra) dell'Image principale
 r = 200      ' Rappresenta la lunghezza del raggio (la distanza di ogni immagine-lettera dal centro)
 
' Crea l'Oggetto "Image" ove saranno disegnate le singole immagini dei caratteri per ricreare il testo ruotato:
 im = New Image(pb.W, pb.H, Color.Yellow, gb.Standard)
 
' Imposta il punto (sulla base dei gradi) della circonferenza da dove cominciare (in senso orario) a disegnare le singole Image nella Image "im" superficie principale:
 an = 180
 
 For b = 0 To ii.Max
' Imposta la curvatura delle singole Image dei caratteri:
   x = x_a + r * Cos(Rad(an)) 
   y = y_o + r * Sin(Rad(an))
   With Paint
     .Begin(im)
     .DrawImage(ii[b], x, y, ii[b].W, ii[b].H, 1.0, Null)
     .End
   End With
' Imposta la distanza delle singole immagini dei caratteri fra esse:
   an += CURVATURA
 Next
 
 pb.Image = im

End