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

Da Gambas-it.org - Wikipedia.
(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...")
 
 
(13 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
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.
+
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. <SUP>&#091;<B>[[#Note|nota 1]]</b>&#093;</sup>
 
<BR>Ciascuna lettera o sillaba verrebbe quindi disegnata in uno di quegli oggetti ''Image''.
 
<BR>Ciascuna lettera o sillaba verrebbe quindi disegnata in uno di quegli oggetti ''Image''.
 
<BR>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.
 
<BR>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:
 
Mostriamo un esempio pratico:
  '''Public''' Sub Form_Open()
+
  Private Const GRADI_INIZIO As Float = 250.0
    
+
Private Const CURVATURA As Float = 8.0
   Dim im, i As Image
+
Private Const FONT_NOME As String = "Liberation Mono"
 +
Private Const FONT_DIM As Float = 20
 +
 +
 +
Public Sub Form_Open()
 +
 +
   Dim pb As PictureBox
 +
  Dim bb As Byte[]
 +
  Dim s 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 28:
 
     .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:''
  ' ''Carica ogni carattere del testo In un vettore Byte[] per poter estrarre di ciascuno il valore:''</font>
+
  ' ''Carica ogni carattere del testo In un vettore Byte[] per poter estrarre di ciascuno il valore.''</font>
   bb = bb.FromString("È lì giù che saprò se vivrà.")
+
   bb = Byte[].FromString("Questo è un testo qualsiasi")
 
    
 
    
<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 = GRADI_INIZIO
 
    
 
    
<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 = 0 To bb.Max
   
+
  <FONT Color=gray>' ''Verifica innanzitutto se il carattere è accentato (carattere ASCII speciale):''</font>
  <FONT Color=gray>' ''Verifica se il carattere è accentato (carattere ASCII speciale):''</font>
 
 
     If bb[b] > 127 Then
 
     If bb[b] > 127 Then
 
  <FONT Color=gray>' ''Se è un carattere accentato, per riottenerlo nell'Image, combina i due valori che lo compongono:''</font>
 
  <FONT Color=gray>' ''Se è un carattere accentato, per riottenerlo nell'Image, combina i due valori che lo compongono:''</font>
Riga 47: Riga 54:
 
       s = Chr(bb[b])
 
       s = Chr(bb[b])
 
     Endif
 
     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"
+
<FONT Color=gray>' ''Si impostano solo le proprietà della Classe "Font" che potrebbero influire sulla reale dimensione del carattere:''</font>
       .Size = 18
+
       .Name = FONT_NOME
 +
       .Size = FONT_DIM
 +
      .Bold = True
 
  <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(s), .TextHeight(s), Color.Transparent, gb.Standard)
 
     End With
 
     End With
   
 
 
     With Paint
 
     With Paint
 
       .Begin(i)
 
       .Begin(i)
       .Font.Size = 18
+
      .Font.Name = fo.Name
       .Font.Name = "FreeSans"
+
       .Font.Size = fo.Size
       .Brush = .Color(cl)
+
       .Font.Bold = True
       .Text(s, 1, 1, i.W, i.H, Align.Center)
+
       .Brush = .Color(Color.Red)
      .Fill
+
       .DrawText(s, 0, 0, i.W, i.H, Align.Normal)
 
       .End
 
       .End
 
     End With
 
     End With
   
+
<FONT Color=gray>' ''Ruota l'immagine in senso orario:''</font>
     i = i.Rotate(Rad(an + 90))
+
     i = i.Rotate(Rad(-an))
 +
    ii.Push(i)
 +
<FONT Color=gray>' ''Imposta il valore relativo alla rotazione della prossima immagine contenente un carattere:''</font>
 +
    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 = GRADI_INIZIO - 90.0
 +
 
 +
  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 (avanza lungo la curva del testo definendola):''</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
 
 
    
 
    
  '''End'''
+
  pb.Image = im
 +
 +
  End
 +
 
 +
 
 +
 
 +
=Note=
 +
[1] Vedere anche questa pagina: [[Curvare il testo in una DrawingArea]]

Versione attuale delle 16:39, 25 giu 2024

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. [nota 1]
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 GRADI_INIZIO As Float = 250.0
Private Const CURVATURA As Float = 8.0
Private Const FONT_NOME As String = "Liberation Mono"
Private Const FONT_DIM As Float = 20


Public Sub Form_Open()

 Dim pb As PictureBox
 Dim bb As Byte[]
 Dim s 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:
' Carica ogni carattere del testo In un vettore Byte[] per poter estrarre di ciascuno il valore.
 bb = Byte[].FromString("Questo è un testo qualsiasi")
 
' Imposta il punto (sulla base dei gradi) della circonferenza da dove cominciare (in senso orario) a disegnare le lettere:
 an = GRADI_INIZIO
 
 ii = New Image[]
 
 For b = 0 To bb.Max
' Verifica innanzitutto 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
' Si impostano solo le proprietà della Classe "Font" che potrebbero influire sulla reale dimensione del carattere:
     .Name = FONT_NOME
     .Size = FONT_DIM
     .Bold = True
' Crea un oggetto "Image" per contenere il disegno di una lettera alfabetica:
     i = New Image(.TextWidth(s), .TextHeight(s), Color.Transparent, gb.Standard)
   End With
   With Paint
     .Begin(i)
     .Font.Name = fo.Name
     .Font.Size = fo.Size
     .Font.Bold = True
     .Brush = .Color(Color.Red)
     .DrawText(s, 0, 0, i.W, i.H, Align.Normal)
     .End
   End With
' Ruota l'immagine in senso orario:
   i = i.Rotate(Rad(-an))
   ii.Push(i)
' Imposta il valore relativo alla rotazione della prossima immagine contenente un carattere:
   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 = GRADI_INIZIO - 90.0
 
 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 (avanza lungo la curva del testo definendola):
   an += CURVATURA
 Next
 
 pb.Image = im

End


Note

[1] Vedere anche questa pagina: Curvare il testo in una DrawingArea