Textwiedergabe mit Type1-Schriftart | Java

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.

  1. 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:

„Hilfsschritte für diese Strategie“.

Die Implementierung ist wie unten dargestellt.

 1// For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-Java
 2static void drawText(String text, IFont font, double fontSize,
 3           Paint backgroundBrush, Paint textBrush, String outFile) throws Exception
 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.getEncoding().decodeToGid(text.charAt(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    BufferedImage outBitmap = new BufferedImage(960, 720, BufferedImage.TYPE_INT_BGR);
15    //outBitmap.getRaster().SetResolution((float)dpi, (float)dpi);
16    java.awt.Graphics2D outGraphics = (java.awt.Graphics2D) outBitmap.getGraphics();
17    outGraphics.setPaint(backgroundBrush);
18    outGraphics.fillRect(0, 0, outBitmap.getWidth(), outBitmap.getHeight());
19    outGraphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
20    //declare coordinate variables and previous gid
21    GlyphId previousGid = null;
22    double glyphXCoordinate = 0;
23    double glyphYCoordinate = fontSize * resolutionCorrection;
24    //loop which paints every glyph in gids
25    for (GlyphId gid : gids)
26    {
27        // if the font contains the gid
28        if (gid != null)
29        {
30            Glyph glyph = font.getGlyphAccessor().getGlyphById(gid);
31            if (glyph == null)
32                continue;
33	
34            // path that accepts drawing instructions
35            GeneralPath path = new GeneralPath();
36	
37            // Create IGlyphOutlinePainter implementation
38            GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);
39	
40            // Create the renderer
41            IGlyphRenderer renderer = new 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.getMetrics().getKerningValue(previousGid, gid) /
50                           glyph.getSourceResolution()) * fontSize * resolutionCorrection;
51                kerning += fontWidthToImageWith(font.getMetrics().getGlyphWidth(previousGid),
52                        glyph.getSourceResolution(), fontSize, 300);
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.setWindingRule(GeneralPath.WIND_NON_ZERO);
76            outGraphics.setPaint(textBrush);
77            outGraphics.fill(path);
78        }
79        //set current gid as previous to get correct kerning for next glyph
80        previousGid = gid;
81    }
82    //Save results
83    ImageIO.write(outBitmap, "jpg", new File(outFile));
84}
  1. 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-Java
2static double fontWidthToImageWidth(double width, int fontSourceResulution, double fontSize, double dpi)
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-Java
 2String fileName = Utils.getDataDir() + "courier.pfb"; //Font file name with full path
 3
 4FontDefinition fd = new FontDefinition(FontType.Type1, new FontFileDefinition("pfb", new FileSystemStreamSource(fileName)));
 5      Type1Font font = (Type1Font) Font.open(fd);
 6      
 7      try {
 8       drawText("Hello world", font, 14, java.awt.Color.WHITE, java.awt.Color.BLACK, Utils.getDataDir() + "hello1_type1_out.jpg");
 9       drawText("Hello world", font, 14, java.awt.Color.YELLOW, java.awt.Color.RED, Utils.getDataDir() + "hello2_type1_out.jpg");
10      } catch (Exception ex) {
11      	ex.printStackTrace();
12      }
Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.