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 | + | 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>[<B>[[#Note|nota 1]]</b>]</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: | ||
− | + | Private Const GRADI_INIZIO As Float = 250.0 | |
− | + | Private Const CURVATURA As Float = 8.0 | |
− | Dim | + | 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 | ||
− | + | ||
− | + | Me.Show | |
− | |||
− | |||
− | |||
With Me | With Me | ||
Riga 19: | Riga 28: | ||
.W = 600 | .W = 600 | ||
.H = 600 | .H = 600 | ||
+ | .Arrangement = Arrange.Fill | ||
End With | End With | ||
− | + | With pb = New PictureBox(Me) | |
− | + | .X = 0 | |
− | + | .Y = 0 | |
+ | End With | ||
− | <FONT Color=gray>' '' | + | <FONT Color=gray>' ''Imposta il testo da disegnare:'' |
− | ' ''Carica ogni carattere del testo In un vettore Byte[] per poter estrarre di ciascuno il valore | + | ' ''Carica ogni carattere del testo In un vettore Byte[] per poter estrarre di ciascuno il valore.''</font> |
− | bb = | + | bb = Byte[].FromString("Questo è un testo qualsiasi") |
− | |||
− | |||
<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 | + | an = GRADI_INIZIO |
− | + | ii = New Image[] | |
− | |||
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 = | + | <FONT Color=gray>' ''Si impostano solo le proprietà della Classe "Font" che potrebbero influire sulla reale dimensione del carattere:''</font> |
− | .Size = | + | .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) | + | 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 = | + | .Font.Name = fo.Name |
− | .Font. | + | .Font.Size = fo.Size |
− | .Brush = .Color( | + | .Font.Bold = True |
− | . | + | .Brush = .Color(Color.Red) |
− | + | .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 | + | 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( | + | .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 | + | <FONT Color=gray>' ''Imposta la distanza delle singole immagini dei caratteri fra esse (avanza lungo la curva del testo definendola):''</font> |
− | an += | + | an += CURVATURA |
− | |||
− | |||
Next | Next | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | 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