Utilizzo di oggetti Glyph | Soluzione API per .NET
Lavorare con glifi è cruciale durante la codifica dei caratteri in quanto è la loro unità. Quando le informazioni di base sui glifi sono spiegate nell’articolo Articolo del What is Font Paragraph, qui ti insegneremo la funzionalità di Aspose.Font per aver lavorato con glifi e gli oggettiGlyphin particolare.
Oggetto Glyph
Glifi di qualsiasi carattere sono rappresentati da glifo digitare in libreria Asposa. Font. Quindi, il tipo Glyph è un oggetto universale per glifi del carattere, indipendentemente dal formato di caratteri (truetype, formato di carattere compatto, ecc.).
La funzionalità fornita dall’oggetto glifo
Quale funzionalità ci fornisce questo oggetto?
Questa domanda viene data risposta dalle proprietà che ha.
- Innanzitutto, diamo un’occhiata alla proprietà State. Alcuni caratteri possono essere corrotti e anche i loro glifi possono essere corrotti. Proprietà State ci dice se il glifo è corrotto. Se ha il valore ParsedWithErrors, allora quel glifo è stato analizzato con errori e non tutti i dati del glifo sono stati ricevuti.
- Proprietà widthvectorx e LeftSidebearingX ci raccontano di tali metriche di glifi come larghezza avanzata e cuscinetto del lato sinistro di conseguenza.
- Proprietà WidthVectorY e LeftSidebearingY hanno lo stesso senso di widthvectorx e LeftSidebearingX, ma WidthVectorY e LeftSidebearingY correlate a coordinate per l’asse Y verticale.
Facciamo un Esempio con lo snippet di codice successivo che mostra come calcolare la larghezza per il testo “Hello World” nei pixel quando la dimensione del carattere è 10.
Aggiungi gli spazi dei nomi successivi alla testa del file:
1 using Aspose.Font.Glyphs;
2 using Aspose.Font.Font font;
Quindi devi fare i passi successivi:
1 Aspose.Font.Font font;
2
3 // Declare text and other constants
4 const string text = "Hello world";
5 const int fontSize = 10;
6
7 //Declare a variable for string width
8 double width = 0;
9
10 //Get glyphs for each letter in the text and calculate the width for the whole text
11 //The same result can be achieved using the method font.Metrics.MeasureString (text, fontSize)
12 foreach (char symbol in text)
13 {
14 GlyphId gid = font.Encoding.DecodeToGid(symbol);
15 Glyph glyph = font.GetGlyphById(gid);
16 width += (glyph.WidthVectorX / font.Metrics.UnitsPerEM) * fontSize;
17 }
Per ottenere la casella di delimitazione del glifo utilizzare la proprietà glyphbbox dell’oggetto glyph.
Per ottenere una rappresentazione visiva dei glifi devi conoscere le coordinate per tutti i punti glifi.
Come ottenere coordinate per tutti i punti glifi dall’oggetto glifo?
Le prossime proprietà, isEmpty e Path sono state progettate per questo caso.
Proprietà isEmpty è ausiliario. Ci dice se il percorso del glifo è vuoto o in altre parole il glifo non ha alcuna istruzione di disegno. Se ha il valore *falso *, è tempo di costruire la figura del glifo intero usando la proprietà molto utile percorso.
Nel concetto di Aspose.Font Library la rappresentazione di qualsiasi glifo è divisa in primitive grafiche più semplici, chiamateSegments, e rappresentata dall’interfaccia ipathsegment. Interfaccia IpathSegment è una primitiva grafica astratta di base.
I primitivi grafici in cemento sono rappresentati da tipi come moveto, lineto, Curveto e ClosePath.
Tipo ClosePath viene utilizzato per indicare la fine del contorno grafico corrente.
Tipi Moveto, LineTo e CurveTo per la loro definizione corrispondono agli identici operatori PostScript.
Inoltre, i tipi MoveTo e LineTo per la loro definizione corrispondono alle funzioni MoveToEx()
e LineTo()
da Windows gdi lib, tipo CurveTo è usato per descrivere le curve Bézier.
- Glyph* Proprietà* Path* ci fornisce una raccolta di tutti i primitivi grafici per quel glifo. ProprietàPathha tipo SegmentPath e ogni oggetto di questo tipo ha proprietà Segments di tipo PathSegmentCollection. Questa proprietà Segments restituisce tutti i primitivi grafici che oggetto SegmentPath include. In altre parole, possiamo ottenere tutte le primitive grafiche per il glifo usando il glifo.Path.Path.Path.
Il prossimo Esempio calcola tutti i punti che il glifo ha e li memorizza in “punti” variabili, che rappresenta un array di oggetti con tipo punto.
La logica utilizzata da questo campione è semplice e non estrae contorni glifi. Per ottenere questi contorni usando il tipo ClosePath deve essere aggiunto all’elaborazione dei segmenti.
Aggiungi gli spazi dei nomi successivi alla testa del file:
1 using System.Collections.Generic;
2 using System.Drawing;
3 using Aspose.Font.Glyphs;
4 using Aspose.Font.RenderingPath;
Quindi devi fare i passi successivi:
1 Glyph Glyph;
2
3 //Declare resultant list with points
4 List<Point> points = new List<Point>();
5
6 //Init service reference on IPathSegment
7 IPathSegment prevSegment = null;
8
9 //Iterate all glyph path segments and collect points
10 foreach (IPathSegment segment in glyph.Path.Segments)
11 {
12 if ((segment is LineTo)
13 || (segment is CurveTo))
14 {
15 if (prevSegment is MoveTo)
16 {
17 MoveTo moveTo = prevSegment as MoveTo;
18 AddPoint((int)moveTo.X, (int)moveTo.Y, points);
19 }
20 if (segment is LineTo)
21 {
22 LineTo line = segment as LineTo;
23 AddPoint((int)line.X, (int)line.Y, points);
24 }
25 else if (segment is CurveTo)
26 {
27 CurveTo curve = segment as CurveTo;
28 AddPoint((int)curve.X1, (int)curve.Y1, points);
29 AddPoint((int)curve.X2, (int)curve.Y2, points);
30 AddPoint((int)curve.X3, (int)curve.Y3, points);
31 }
32 }
33 prevSegment = segment;
34 }
35
36 void AddPoint(int x, int y, List<Point> points)
37 {
38 Point p = new Point();
39 p.X = x;
40 p.Y = y;
41 points.Add(p);
42 }
Come calcolare il valore di kerning per i glifi?
Un’altra metrica glifi ma quella che non è fornita dall’oggetto di tipo glifo. Qui stiamo parlando di kerning. Una caratteristica come il kerning, non si applica a una ma a una coppia di glifi. Quindi, per calcolare il kerning è necessario utilizzare l’identificatore non di uno ma di due glifi.
Interfaccia ifontMetrics nella libreria Aspose.Font definisce il metodo getkerningValue () che prende identificatori di glifi per una coppia di glifi e restituisce un valore di kerning, relativo a quella coppia. Se non esistono informazioni di kerning per la coppia di glifi, il metodo restituisce 0. L’implementazione dell’interfaccia * ifontmetrics * esiste per tutte le classi di formati di carattere supportati ed è accessibile utilizzando la proprietà metrica.
Il successivo snippet calcola il valore di kerning per glifi associati ai simboli “A” e “C”:
1 Font font;
2
3 double kerning = font.Metrics.GetKerningValue(font.Encoding.UnicodeToGid('A'), font.Encoding.UnicodeToGid('C'));
Come ottenere glifi dal carattere?
Qualsiasi glifo in un carattere può essere accessibile da un identificatore di glifi speciale. Questa regola è vera per qualsiasi formato di carattere.
Gli identificatori di glifi glyphid possono essere di due tipi: intero o stringa. Questi tipi di dati * glyphid * sono collegati a caratteristiche di glyph come l’indice del glyph e il nome del glifo di conseguenza.
Inoltre, ogni glifo ha un indice pari alla sua numerazione nel carattere. Un momento importante è che la numerazione non inizia da 1 ma da 0, quindi se un carattere contiene 15 glifi, hanno ID glifo 0–14.
I glifi di solito hanno anche nomi di glifi che sono brevi etichette di testo ASCII senza spazi. Ad esempio, il nome di glifo per il simbolo “+” è “più”.
Quindi il tipo di dato intero
corrisponde a una caratteristica del glifo come l’indice del glifo, mentre il tipo di dato string
corrisponde al nome del glifo. Ogni glifo di un font rappresenta l’immagine del simbolo a cui è associato, quindi il glifo è collegato non solo al suo identificatore, ma anche al codice univoco corrispondente a quel simbolo.
La relazione tra codici di caratteri e identificatori di glifi è chiamata codifica. Glifi nel carattere sono accessibili direttamente da identificatori di glifi o usando la codifica.
Nel ultimo caso, viene calcolato l’identificatore di glifi basato sul codice del carattere. Quindi viene ricevuto il glifo corrispondente all’identificatore calcolato.
Che tipo di identificatore di glifi dovrebbe essere usato per accedere al glifo desiderato?
Dipende dal formato del carattere. Glifi in caratteri del formato di caratteri di Type 1 e del formato di caratteri compatti (CFF) sono accessibili con il nome del glifo. In realtà, gli glifi nei caratteri di questi formati sono mantenuti come un array e sono fisicamente accessibili tramite indice numerico ma al livello logico più elevato per ottenere un nome di glifo, viene utilizzato il nome.
I caratteri TrueType usano il tipo di intero per gli identificatori di glifi. Se il carattere TrueType ha la tabella “Post”, il nome del glifo o un identificatore di glifi del tipo di stringa possono essere utilizzati per accedere al glifo.
Recupero glifi dal carattere usando la libreria Aspose.Font.
Aspose.Font Library introduce lo spazio dei nomi aspose.font.glyphs in cui vengono posizionati glifi, identificatori di glifi e altri oggetti. Classe GlyphId è una classe astratta di base per gli identificatori di glifi. Gli oggetti di quella classe vengono utilizzati per ottenere glifi desiderati.
Gli identificatori di glicio per numeri interi e un tipo di stringa sono rappresentati da classi GlyphUint32id e Glyphstringid di conseguenza.
Entrambe queste classi sono ereditate dalla classe astratta di base * glyphid * e in particolare gli oggetti di questa classe astratta * glyphid * vengono passati nella funzione della libreria per l’accesso al glifo necessario. Quindi, per ottenere il glifo richiesto, si crea un oggetto *GlyphUint32ID *o *GlyphstringId *e quindi passare l’oggetto creato a una delle funzioni progettate per il recupero degli glifi.
Nella maggior parte dei casi, non si sa quale identificatore di glico corrisponda al carattere specifico per ottenere l’identificatore del glico è necessario trovare la relazione tra codice di carattere e identificatore di glifi.
Come è stato menzionato in precedenza, la codifica dei caratteri è responsabile di tali relazioni. La funzionalità di codifica del carattere base è definita dall’interfaccia ifontencoding.
Interfaccia di base IFont implementato da tutte le classi di carattere definisce la proprietà codifica di tipoifontenCoding, quindi qualsiasi oggetto di carattere creato da Aspose.Font Library fornisce l’implementazione perifontencodingfunzionalità da parte della proprietàcodifica.
I metodi successivi sono stati progettati per calcolare l’identificatore del glyph per un codice carattere: unicodetogid (), decodetogid e decodetogidparameterized:
- Usa il metodo UnicodeToGid() Se il codice del personaggio è unicode.
- Se il codice del tuo personaggio non è unicode, utilizzare DecodeToGid().
- Metodo DecodeToGidParameterized() è progettato per i casi composti quando sono necessari parametri speciali per calcolare gli identificatori di glifi.
Dopo aver ottenuto un identificatore di gettofo o in altre parole un riferimento all’oggetto glyphid, è possibile ottenere il glifo associato a questoglicousando la funzionalità, definita dall’interfaccia iglyphaccessor.
L’interfacciaiglyphaccessorè implementata da qualsiasi classe, derivata dalla classe BaseFonted è accessibile dalla proprietà ifont.glyphaccessor.
Interfaccia iglyphaccessor definisce il metodo getglyphbyid (). Usa questo metodo per far passare il glifo per GlyphId.
L’esempio di come utilizzare il metodo GetGlyphById per ottenere GlyphId e il glifo corrispondente è incluso nell’esempio tratto dal capitolo La funzionalità fornita dall’oggetto Glyph.
I prossimi 2 metodi di questa interfaccia sono progettati per ottenere identificatori di glifi:
- Se hai bisogno di ottenere un identificatore di glifi per ogni carattere in una stringa di testo, è possibile utilizzare il metodo getGlyPhsForText ().
- Metodo getAllGlyphids () è progettato per ottenere tutti gli identificatori di glifi, disponibili nel carattere.
Inoltre, l’interfacciaiglyphaccessordefinisce la proprietà glyphidType che ci dice quale tipo di dati, intero o stringa иеeет identificatore di glyph.
Il supporto per il recupero degli glifi è più potente per i caratteri TrueType. Qui puoi trovare le informazioni su come ottenere l’accesso ai glifi del carattere.
Tutti gli esempi dell’uso di Aspose.Font sono archiviati in aspose.font.examples.sln Solution, in net-examples della documentazione Aspose.Font
In caso di problemi, puoi pubblicarli nella sezione aspose.font.product del Forum di supporto gratuito e in poche ore il nostro team di supporto chiarirà tutto per te.