Textwiedergabe mit Type1-Schriftart | .NET
Contents
[
Hide
Show
]Text rendern
Um Text mit dem Glyphen-Outline-Renderer darzustellen, implementieren Sie die Schnittstelle Aspose.Font.Rendering.IGlyphOutlinePainter und erstellen Sie damit Pfade für einzelne Glyphen.
- Erstellen Sie eine Klasse
Type1GlyphOutlinePainter, die einenSystem.Drawing.Drawing2D.GraphicsPathakzeptiert. Ihre Methoden übertragen die Umrissbefehle der Schriftart als Linien und Bézierkurven in diesen Pfad.
1// Implement a painter that builds a graphics path from a glyph outline
2
3internal sealed class Type1GlyphOutlinePainter : IGlyphOutlinePainter
4{
5 private readonly GraphicsPath path;
6 private PointF currentPoint;
7
8 public Type1GlyphOutlinePainter(GraphicsPath path)
9 {
10 this.path = path;
11 }
12
13 public void MoveTo(MoveTo moveTo)
14 {
15 path.CloseFigure();
16 currentPoint = new PointF((float)moveTo.X, (float)moveTo.Y);
17 }
18
19 public void LineTo(LineTo lineTo)
20 {
21 PointF nextPoint = new PointF((float)lineTo.X, (float)lineTo.Y);
22 path.AddLine(currentPoint, nextPoint);
23 currentPoint = nextPoint;
24 }
25
26 public void CurveTo(CurveTo curveTo)
27 {
28 PointF nextPoint = new PointF((float)curveTo.X3, (float)curveTo.Y3);
29 path.AddBezier(
30 currentPoint,
31 new PointF((float)curveTo.X1, (float)curveTo.Y1),
32 new PointF((float)curveTo.X2, (float)curveTo.Y2),
33 nextPoint);
34 currentPoint = nextPoint;
35 }
36
37 public void ClosePath()
38 {
39 path.CloseFigure();
40 }
41}- Erstellen Sie eine Methode
DrawText(), die Text in einSystem.Drawing.Bitmapzeichnet und als PNG-Datei speichert. Die Methode führt folgende Schritte aus:
- Jedes Zeichen im Text wird in eine Glyphen-ID dekodiert.
- Eine Bitmap mit 960 × 720 Pixeln und 300 DPI wird erstellt, der Hintergrund gefüllt und hochwertige Glättung aktiviert.
- Für jede Glyphe werden die Vorlaufbreite der vorherigen Glyphe und der Kerningwert des Paars zur horizontalen Position addiert.
- Für die aktuelle Glyphe werden ein
GraphicsPath, einType1GlyphOutlinePainterund einGlyphOutlineRenderererstellt. - Eine
TransformationMatrixskaliert und positioniert die Glyphe; anschließend wird der Pfad mit dem angegebenen Textpinsel gefüllt. - Die Bitmap wird ausdrücklich als PNG gespeichert. Bitmap, Grafikobjekt und Glyphenpfade werden danach freigegeben.
Die Grundlinie bleibt in diesem Beispiel konstant. Die horizontale Koordinate ergibt sich aus Vorlauf und Kerning der vorherigen Glyphe. FontWidthToImageWidth() konvertiert Schrifteinheiten anhand von Quellauflösung, Schriftgröße und DPI in Bildpixel.
Die Implementierung von DrawText() ist unten dargestellt.
1// Render text into a bitmap with a custom glyph outline painter
2
3private static void DrawText(string text, IFont font, double fontSize,
4 Brush backgroundBrush, Brush textBrush, string outputFile)
5{
6 GlyphId[] glyphIds = text
7 .Select(character => font.Encoding.DecodeToGid(character))
8 .ToArray();
9 const double dpi = 300;
10 double resolutionCorrection = dpi / 72;
11
12 using var outputBitmap = new Bitmap(960, 720);
13 outputBitmap.SetResolution((float)dpi, (float)dpi);
14 using Graphics outputGraphics = Graphics.FromImage(outputBitmap);
15 outputGraphics.FillRectangle(backgroundBrush, 0, 0, outputBitmap.Width, outputBitmap.Height);
16 outputGraphics.SmoothingMode = SmoothingMode.HighQuality;
17
18 GlyphId? previousGlyphId = null;
19 double glyphXCoordinate = 0;
20 double glyphYCoordinate = fontSize * resolutionCorrection;
21
22 foreach (GlyphId glyphId in glyphIds)
23 {
24 Glyph glyph = font.GlyphAccessor.GetGlyphById(glyphId);
25 if (glyph == null)
26 continue;
27
28 if (previousGlyphId != null)
29 {
30 double kerning = font.Metrics.GetKerningValue(previousGlyphId, glyphId)
31 / (double)glyph.SourceResolution * fontSize * resolutionCorrection;
32 double advance = FontWidthToImageWidth(
33 font.Metrics.GetGlyphWidth(previousGlyphId),
34 glyph.SourceResolution,
35 fontSize,
36 dpi);
37 glyphXCoordinate += kerning + advance;
38 }
39
40 using var path = new GraphicsPath();
41 var outlinePainter = new Type1GlyphOutlinePainter(path);
42 IGlyphRenderer renderer = new GlyphOutlineRenderer(outlinePainter);
43 var glyphMatrix = new TransformationMatrix(new double[]
44 {
45 fontSize * resolutionCorrection,
46 0,
47 0,
48 -fontSize * resolutionCorrection,
49 glyphXCoordinate,
50 glyphYCoordinate
51 });
52
53 renderer.RenderGlyph(font, glyphId, glyphMatrix);
54 path.FillMode = FillMode.Winding;
55 outputGraphics.FillPath(textBrush, path);
56 previousGlyphId = glyphId;
57 }
58
59 outputBitmap.Save(outputFile, ImageFormat.Png);
60}- Fügen Sie die Hilfsmethode hinzu, die eine Breite in Schrifteinheiten in Bildpixel umrechnet.
1// Convert a width in font units to pixels
2
3private static double FontWidthToImageWidth(double width, int fontSourceResolution,
4 double fontSize, double dpi = 300)
5{
6 double resolutionCorrection = dpi / 72;
7 return width / fontSourceResolution * fontSize * resolutionCorrection;
8}Aufrufen der Textrendering-Funktion
Das folgende Beispiel lädt Type1/courier.pfb aus DataDir, rendert denselben Text mit zwei Farbschemata und schreibt beide PNG-Dateien nach OutputDir.
1// Load a Type1 font and render text in two color schemes
2
3string fileName = Path.Combine(DataDir, "Type1", "courier.pfb");
4FontDefinition fontDefinition = new FontDefinition(
5 FontType.Type1,
6 new FontFileDefinition("pfb", new FileSystemStreamSource(fileName)));
7
8Type1Font? font = Aspose.Font.Font.Open(fontDefinition) as Type1Font;
9if (font == null)
10 throw new InvalidOperationException("Unable to load the Type1 font.");
11
12string firstOutput = Path.Combine(OutputDir, "hello1_type1_out.png");
13string secondOutput = Path.Combine(OutputDir, "hello2_type1_out.png");
14DrawText("Hello world", font, 14, Brushes.White, Brushes.Black, firstOutput);
15DrawText("Hello world", font, 14, Brushes.Yellow, Brushes.Red, secondOutput);