Verwenden von Glyph-Objekten | API-Lösung für .NET

Die Arbeit mit Glyphen ist beim Codieren von Schriftarten von entscheidender Bedeutung, da es sich dabei um deren Einheit handelt. Wenn die grundlegenden Informationen zu Glyphen im Artikel des Absatzes Was ist eine Schriftart erläutert werden, zeigen wir Ihnen hier die Funktionalität von Aspose.Font für die Arbeit mit Glyphen und insbesondere die Glyph-Objekte.

Glyph-Objekt

Glyphen jeder Schriftart werden durch den Typ Glyph in der Aspose.Font-Bibliothek dargestellt. Der Typ Glyph ist also ein universelles Objekt für Schriftglyphen, unabhängig vom Schriftformat (TrueType, Compact Font Format usw.).

Die vom Glyph-Objekt bereitgestellte Funktionalität

Welche Funktionalität bietet uns dieses Objekt?

Diese Frage wird durch die Eigenschaften beantwortet, die es hat.

Lassen Sie uns ein Beispiel mit dem nächsten Codeausschnitt erstellen, der zeigt, wie die Breite für den Text „Hallo Welt“ in Pixel berechnet wird, wenn die Schriftgröße 10 beträgt.

Fügen Sie am Kopf der Datei die nächsten Namespaces hinzu:

1using Aspose.Font.Glyphs;			
2using Aspose.Font.Font font;

Dann müssen Sie die nächsten Schritte unternehmen:

 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    }

Um den Begrenzungsrahmen der Glyphe zu erhalten, verwenden Sie die Eigenschaft GlyphBBox des Objekts Glyph.

Um eine visuelle Darstellung von Glyphen zu erhalten, müssen Sie die Koordinaten aller Glyphenpunkte kennen.

Wie erhalte ich Koordinaten für alle Glyphenpunkte vom Glyph-Objekt?

Die nächsten Eigenschaften, IsEmpty und Path, wurden für diesen Fall entworfen.

Die Eigenschaft IsEmpty ist eine Hilfseigenschaft. Es sagt uns, ob der Pfad der Glyphe leer ist, oder mit anderen Worten, die Glyphe hat überhaupt keine Zeichenanweisungen. Wenn es den Wert false hat, ist es an der Zeit, die Figur der gesamten Glyphe mithilfe der sehr nützlichen Eigenschaft Path zu erstellen.

Im Konzept der Aspose.Font-Bibliothek wird die Darstellung einer beliebigen Glyphe in die einfachsten grafischen Grundelemente, sogenannte Segmente, unterteilt und durch die Schnittstelle IPathSegment dargestellt. Die Schnittstelle IPathSegment ist ein abstraktes Basisgrafikprimitiv.

Konkrete grafische Grundelemente werden durch Typen wie MoveTo, LineTo, CurveTo und ClosePath dargestellt.

Der Typ ClosePath wird verwendet, um das Ende der aktuellen grafischen Kontur anzuzeigen.

Die Typen MoveTo, LineTo und CurveTo entsprechen ihrer Definition nach den identischen Postscript-Operatoren.

Außerdem entsprechen die Typen MoveTo und LineTo ihrer Definition nach den Funktionen „MoveToEx()“ und „LineTo()“ aus der Windows GDI-Bibliothek. Der Typ CurveTo wird zur Beschreibung von Bézier-Kurven verwendet.

Die Glyph-Eigenschaft Path stellt uns eine Sammlung aller grafischen Grundelemente für diese Glyphe zur Verfügung.

Die Eigenschaft Path hat den Typ SegmentPath und jedes Objekt dieses Typs hat die Eigenschaft Segments vom Typ PathSegmentCollection. Diese Eigenschaft Segments gibt alle grafischen Grundelemente zurück, die das Objekt SegmentPath enthält. Mit anderen Worten: Mit dem Eintrag glyph.Path.Segments können wir alle grafischen Grundelemente für die Glyphe abrufen.

Das nächste Beispiel berechnet alle Punkte, die die Glyphe hat, und speichert sie in der Variablen „points“, die ein Array von Objekten vom Typ Point darstellt.

Die von diesem Beispiel verwendete Logik ist einfach und es werden keine Glyphenkonturen extrahiert. Um diese Konturen mithilfe des Typs ClosePath zu erhalten, muss der Segmentverarbeitung hinzugefügt werden.

Fügen Sie am Kopf der Datei die nächsten Namespaces hinzu:

1using System.Collections.Generic;
2using System.Drawing;
3using Aspose.Font.Glyphs;
4using Aspose.Font.RenderingPath;

Dann müssen Sie die nächsten Schritte unternehmen:

 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    }

Wie berechnet man den Kerning-Wert für Glyphen?

Eine weitere Glyph-Metrik, die jedoch nicht vom Objekt vom Typ Glyph bereitgestellt wird. Hier sprechen wir von Kerning. Eine solche Eigenschaft wie Kerning gilt nicht für eine, sondern für ein Glyphenpaar. Um das Kerning zu berechnen, müssen Sie also nicht die Kennung eines, sondern zweier Glyphen verwenden.

Die Schnittstelle IFontMetrics in der Aspose.Font-Bibliothek definiert die Methode GetKerningValue(), die Glyphen-IDs für ein Glyphenpaar entgegennimmt und einen Kerning-Wert zurückgibt, der sich auf dieses Paar bezieht. Wenn für das Glyphenpaar keine Kerning-Informationen vorhanden sind, gibt die Methode 0 zurück.

Die Implementierung der IFontMetrics-Schnittstelle existiert für alle Klassen unterstützter Schriftformate und ist über die Eigenschaft Metrics zugänglich.

Das nächste Snippet berechnet den Kerning-Wert für Glyphen, die den Symbolen „A“ und „C“ zugeordnet sind:

1    Font font; 
2
3    double kerning = font.Metrics.GetKerningValue(font.Encoding.UnicodeToGid('A'), font.Encoding.UnicodeToGid('C'));	

Wie erhalte ich Glyphen aus der Schriftart?

Auf jede Glyphe in einer Schriftart kann über eine spezielle Glyphen-ID zugegriffen werden. Diese Regel gilt für jedes Schriftformat.

Glyph-Bezeichner GlyphId können von zwei Typen sein: Ganzzahl oder Zeichenfolge. Diese GlyphId-Datentypen sind entsprechend mit Glyphenmerkmalen wie dem Glyphenindex und dem Glyphennamen verknüpft.

Außerdem hat jedes Glyph einen Index, der seiner Nummerierung in der Schriftart entspricht. Ein wichtiger Punkt ist, dass die Nummerierung nicht bei 1, sondern bei 0 beginnt. Wenn eine Schriftart also 15 Glyphen enthält, haben sie die Glyphen-IDs 0–14.

Die Glyphen haben normalerweise auch Glyphennamen, bei denen es sich um kurze ASCII-Textbezeichnungen ohne Leerzeichen handelt. Der Glyphenname für das Symbol „+“ lautet beispielsweise „plus“.

Der Datentyp „Integer“ entspricht also einem Merkmal der Glyphe wie dem Glyphenindex, und der Datentyp „String“ entspricht dem Namen der Glyphe. Jede Glyphe einer Schriftart stellt das Bild des Symbols dar, mit dem diese Glyphe verknüpft ist. Die Glyphe ist also nicht nur mit ihrer Kennung verknüpft, sondern auch mit dem eindeutigen Code, der diesem Symbol entspricht.

Die Beziehung zwischen Zeichencodes und Glyphen-Identifikatoren wird als Kodierung bezeichnet. Auf Glyphen in der Schriftart kann direkt über Glyphen-IDs oder mithilfe der Kodierung zugegriffen werden.

Im letzten Fall wird zunächst die Glyphen-ID basierend auf dem Zeichencode berechnet. Dann wird die Glyphe empfangen, die der berechneten Kennung entspricht.

Welche Art von Glyphen-ID sollte für den Zugriff auf die gewünschte Glyphe verwendet werden?

Es hängt vom Format der Schriftart ab. Auf Glyphen in Schriftarten des Type 1 Font Format und des Compact Font Format (CFF) kann über den Glyphennamen zugegriffen werden. Tatsächlich werden Glyphen in Schriftarten dieser Formate als Array gespeichert und sind physisch über einen numerischen Index zugänglich, aber auf der höheren logischen Ebene wird zum Abrufen einer Glyphe deren Name verwendet.

TrueType-Schriftarten verwenden einen Ganzzahltyp für Glyphenbezeichner. Wenn die TrueType-Schriftart über eine „Post“-Tabelle verfügt, kann der Glyphenname oder eine Glyphen-ID vom Typ „String“ für den Zugriff auf die Glyphe verwendet werden.

Abrufen von Glyphen aus der Schriftart mithilfe der Aspose.Font-Bibliothek.

Die Aspose.Font-Bibliothek führt den Namensraum Aspose.Font.Glyphs ein, in dem Glyphen, Glyphen-IDs und andere Objekte platziert werden. Die Klasse GlyphId ist eine abstrakte Basisklasse für Glyph-IDs. Objekte dieser Klasse werden verwendet, um gewünschte Glyphen zu erhalten.

Glyph-Bezeichner für Ganzzahlen und einen Zeichenfolgentyp werden entsprechend durch die Klassen GlyphUInt32Id und GlyphStringId dargestellt.

Beide Klassen werden von der abstrakten Basisklasse GlyphId geerbt und insbesondere die Objekte dieser abstrakten Klasse GlyphId werden in der Funktion der Bibliothek für den Zugriff auf die benötigte Glyphe übergeben. Um das erforderliche Glyph zu erhalten, erstellen Sie also ein Objekt vom Typ GlyphUInt32Id oder GlyphStringId und übergeben das erstellte Objekt dann an eine der Funktionen, die zum Abrufen von Glyphen konzipiert sind.

In den meisten Fällen wissen Sie nicht, welcher Glyphenbezeichner dem jeweiligen Zeichen entspricht. Um den Glyphenbezeichner zu erhalten, müssen Sie daher die Beziehung zwischen Zeichencode und Glyphenbezeichner ermitteln.

Wie oben erwähnt, ist für solche Beziehungen die Schriftkodierung verantwortlich. Die Basisfunktionalität der Schriftartenkodierung wird durch die Schnittstelle IFontEncoding definiert.

Die von allen Schriftartklassen implementierte Basisschnittstelle IFont definiert die Eigenschaft Encoding vom Typ IFontEncoding, sodass jedes von der Aspose.Font-Bibliothek erstellte Schriftartobjekt die Implementierung der IFontEncoding-Funktionalität durch bietet Eigenschaft Encoding.

Die nächsten Methoden wurden entwickelt, um die Glyphen-ID für einen Zeichencode zu berechnen: UnicodeToGid(), DecodeToGid und DecodeToGidParameterized:

Nachdem Sie eine Glyph-ID oder mit anderen Worten einen Verweis auf das GlyphId-Objekt erhalten haben, können Sie die dieser GlyphId zugeordnete Glyphe mithilfe der Funktionalität abrufen, die durch die Schnittstelle IGlyphAccessor definiert wird.

Die Schnittstelle IGlyphAccessor wird von jeder Klasse implementiert, die von der Basisklasse Font abgeleitet ist, und ist über die Eigenschaft IFont.GlyphAccessor zugänglich.

Schnittstelle IGlyphAccessor definiert die Methode GetGlyphById(). Verwenden Sie diese Methode, um das Glyph für die übergebene GlyphId abzurufen.

Das Beispiel für die Verwendung der GetGlyphById-Methode zum Abrufen von GlyphId und der entsprechenden Glyphe ist im Beispiel aus dem Kapitel Die vom Glyph-Objekt bereitgestellte Funktionalität enthalten.

Die nächsten beiden Methoden dieser Schnittstelle dienen zum Abrufen von Glyphen-IDs:

Außerdem definiert die Schnittstelle IGlyphAccessor die Eigenschaft GlyphIdType, die uns mitteilt, welcher Datentyp, welche Ganzzahl oder Zeichenfolge die Glyph-ID darstellt.

Die Unterstützung für das Abrufen von Glyphen ist für TrueType-Schriftarten leistungsfähiger. Hier finden Sie Informationen dazu, wie Sie Zugriff auf Schriftzeichen erhalten.

Alle Beispiele zur Verwendung von Aspose.Font sind in der Aspose.Font.Examples.sln-Lösung in den net-examples der Aspose.Font-Dokumentation gespeichert.

Wenn Sie irgendwelche Probleme haben, können Sie diese im Abschnitt Aspose.Font.Product Family des Kostenlosen Support-Forums veröffentlichen und innerhalb weniger Stunden wird unser Support-Team alles klären für dich.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.