Textwiedergabe mit Type1-Schriftart | .NET
Contents
[
Hide
Show
]Text rendern
Zum Rendern von Text erfordert das Rendering-Subsystem die Implementierung der Schnittstelle Aspose.Font.Rendering.IGlyphOutlinePainter zum Zeichnen von Glyphen. Dies kann mit den folgenden Schritten erreicht werden.
- Implementieren Sie die IGlyphOutlinePainter-Methoden, indem Sie eine Klasse GlyphOutlinePainter erstellen, die ein Objekt vom Typ System.Drawing.Drawing2D.GraphicsPath für grafische Zeichnungsziele erfordert. Die Implementierung ist wie unten dargestellt.
 1// For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-.NET
 2class GlyphOutlinePainter : IGlyphOutlinePainter
 3{ 
 4    private System.Drawing.Drawing2D.GraphicsPath _path;
 5    private System.Drawing.PointF _currentPoint;
 6
 7    public GlyphOutlinePainter(System.Drawing.Drawing2D.GraphicsPath path)
 8    {
 9        _path = path;
10    }
11
12    public void MoveTo(MoveTo moveTo)
13    {
14        _path.CloseFigure();
15        _currentPoint.X = (float)moveTo.X;
16        _currentPoint.Y = (float)moveTo.Y;
17    }
18
19    public void LineTo(LineTo lineTo)
20    {
21        float x = (float)lineTo.X;
22        float y = (float)lineTo.Y;
23        _path.AddLine(_currentPoint.X, _currentPoint.Y, x, y);
24        _currentPoint.X = x;
25        _currentPoint.Y = y;
26    }
27
28    public void CurveTo(CurveTo curveTo)
29    {
30        float x3 = (float)curveTo.X3;
31        float y3 = (float)curveTo.Y3;
32
33        _path.AddBezier(
34                  _currentPoint.X,
35                  _currentPoint.Y,
36                  (float)curveTo.X1,
37                  (float)curveTo.Y1,
38                  (float)curveTo.X2,
39                  (float)curveTo.Y2,
40                  x3,
41                  y3);
42
43        _currentPoint.X = x3;
44        _currentPoint.Y = y3;
45    }
46
47    public void ClosePath()
48    {
49        _path.CloseFigure();
50    }
51}- Erstellen Sie die Methode „DrawText()“, die den angegebenen Text in das System.Drawing.Bitmap-Objekt zeichnet und die resultierende Bitmap auf der Disc speichert. Dies umfasst die folgenden Schritte:
- Iterieren Sie alle Symbole in der Textzeichenfolge.
- Glyphen-ID für jedes verarbeitete Symbol abrufen – GID.
- Erstellen Sie ein Objekt vom Typ GlyphOutlinePainter, das vom Rendering-Subsystem zum Zeichnen der aktuellen Glyphe benötigt wird.
- Erstellen Sie ein Objekt vom Typ Aspose.Font.Renderers.GlyphOutlineRenderer und übergeben Sie das gerade erstellte Objekt vom Typ GlyphOutlinePainter an den Konstruktor für GlyphOutlineRenderer. Dieses Objekt GlyphOutlineRenderer soll die angegebene Glyphe rendern.
- Rendern Sie das aktuell verarbeitete Glyph mit der Methode GlyphOutlineRenderer.RenderGlyph(). Das Aspose.Fonts.Matrix-Objekt wird zum Angeben von Glyphenkoordinaten verwendet. Die zu rendernde Glyphe wird durch den GID-Parameter angegeben.
„Hilfsschritte für diese Strategie“.
- Die Glyphenkoordinate für die Y-Achse ist für dieses Codefragment konstant.
- Die Glyphenkoordinate für die X-Achse wird für jede verarbeitete Glyphe berechnet.
- Sowohl die X- als auch die Y-Koordinaten werden an das Objekt Aspose.Fonts.Matrix übergeben, das von GlyphOutlineRenderer zum Zeichnen von Glyphen verwendet wird.
- Der Abstand zwischen gerade verarbeiteten und vorherigen Glyphen wird bei jedem Iterationsschritt berechnet. Dieser Abstand wirkt sich auf jede Glyphen-X-Koordinate aus.
- Ein Objekt vom Typ GlyphOutlinePainter zeichnet Glyphen mithilfe von GlyphOutlinePainter nicht direkt in Bitmap, sondern in das Objekt GraphicsPath, das an den Konstruktor für GlyphOutlinePainter übergeben wurde. Daher verwenden wir ein Objekt vom Typ System.Drawing.Graphics, um GraphicsPath in Bitmap zu zeichnen.
- Methode FontWidthToImageWith(), die die Glyphenbreite für das Bitmap-Koordinatensystem berechnet.
Die Implementierung der Methode „DrawText“ ist wie folgt.
 1// For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-.NET
  2static void DrawText(string text, IFont font, double fontSize,
  3            Brush backgroundBrush, Brush textBrush, string outFile)
  4{
  5    //Get glyph identifiers for every symbol in text line
  6    GlyphId[] gids = new GlyphId[text.Length];
  7    for (int i = 0; i < text.Length; i++)
  8        gids[i] = font.Encoding.DecodeToGid(text[i]);
  9    // set common drawing settings
 10    double dpi = 300;
 11
 12    double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
 13    // prepare output bitmap
 14    Bitmap outBitmap = new Bitmap(960, 720);
 15    outBitmap.SetResolution((float)dpi, (float)dpi);
 16    Graphics outGraphics = Graphics.FromImage(outBitmap);
 17    outGraphics.FillRectangle(backgroundBrush, 0, 0, outBitmap.Width, outBitmap.Height);
 18    outGraphics.SmoothingMode = SmoothingMode.HighQuality;
 19    //declare coordinate variables and previous gid
 20    GlyphId previousGid = null;
 21    double glyphXCoordinate = 0;
 22    double glyphYCoordinate = fontSize * resolutionCorrection;
 23    //loop which paints every glyph in gids
 24    foreach (GlyphId gid in gids)
 25    {
 26        // if the font contains the gid
 27        if (gid != null)
 28        {
 29            Glyph glyph = font.GlyphAccessor.GetGlyphById(gid);
 30            if (glyph == null)
 31                continue;
 32
 33            // path that accepts drawing instructions
 34            GraphicsPath path = new GraphicsPath();
 35
 36            // Create IGlyphOutlinePainter implementation
 37            GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);
 38
 39            // Create the renderer
 40            Aspose.Font.Renderers.IGlyphRenderer renderer = new
 41                Aspose.Font.Renderers.GlyphOutlineRenderer(outlinePainter);
 42
 43            // get common glyph properties
 44            double kerning = 0;
 45
 46            // get kerning value
 47            if (previousGid != null)
 48            {
 49                kerning = (font.Metrics.GetKerningValue(previousGid, gid) /
 50                           glyph.SourceResolution) * fontSize * resolutionCorrection;
 51                kerning += FontWidthToImageWith(font.Metrics.GetGlyphWidth(previousGid),
 52                        glyph.SourceResolution, fontSize);
 53            }
 54
 55            // glyph positioning - increase glyph X coordinate according to kerning distance
 56            glyphXCoordinate += kerning;
 57
 58            // Glyph placement matrix
 59            TransformationMatrix glyphMatrix =
 60                new TransformationMatrix(
 61                    new double[]
 62                            {
 63                                    fontSize*resolutionCorrection,
 64                                    0,
 65                                    0,
 66                                // negative because of bitmap coordinate system begins from the top
 67                                    - fontSize*resolutionCorrection,
 68                                    glyphXCoordinate,
 69                                    glyphYCoordinate
 70                            });
 71
 72            // render current glyph
 73            renderer.RenderGlyph(font, gid, glyphMatrix);
 74            // fill the path
 75            path.FillMode = FillMode.Winding;
 76            outGraphics.FillPath(textBrush, path);
 77        }
 78        //set current gid as previous to get correct kerning for next glyph
 79        previousGid = gid;
 80    }
 81    //Save results
 82    outBitmap.Save(outFile);
 83}- Erstellen Sie eine Dienstprogrammmethode, um die Schriftbreite in die Bildbreite umzurechnen, wie im folgenden Codebeispiel gezeigt
1// For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-.NET
2static double FontWidthToImageWith(double width, int fontSourceResulution, double fontSize, double dpi = 300)
3{
4    double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
5    return (width / fontSourceResulution) * fontSize * resolutionCorrection;
6}Aufrufen der Funktion „Text rendern“.
Um die oben genannten Implementierungen zu verwenden, kann der folgende Beispielcode über die Main-Methode einer konsolenbasierten Anwendung ausgeführt werden.
1// For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-.NET
2string fileName = dataDir + "courier.pfb"; //Font file name with full path
3
4FontDefinition fd = new FontDefinition(FontType.Type1, new FontFileDefinition("pfb", new FileSystemStreamSource(fileName)));
5Type1Font font = Aspose.Font.Font.Open(fd) as Type1Font;
6            
7
8DrawText("Hello world", font, 14, Brushes.White, Brushes.Black, dataDir + "hello1_type1_out.jpg");
9DrawText("Hello world", font, 14, Brushes.Yellow, Brushes.Red, dataDir + "hello2_type1_out.jpg");