renderizza il testo usando il carattere in Java

Nell’articolo precedente, hai visto come caricare i font CFF, TrueType e Type1 a livello di codice usando Java. Oggi discuteremo un’altra caratteristica interessante della nostra API di manipolazione dei caratteri Java: il rendering del testo utilizzando i caratteri. Entro la fine di questo articolo, sarai in grado di eseguire il rendering del testo utilizzando i caratteri TrueType e Type1 dalle tue applicazioni Java. Quindi iniziamo.

API di manipolazione dei caratteri Java

Aspose.Font for Java ti fornisce le funzionalità per caricare e salvare i font, oltre a ottenere le metriche dei tipi di font più diffusi, inclusi CFF, TrueType, OpenType e Type1. Inoltre, l’API consente di eseguire il rendering del testo utilizzando i caratteri TrueType o Type1 forniti. Puoi installare l’API utilizzando le configurazioni Maven o scaricare il JAR dell’API.

<repository>
    <id>AsposeJavaAPI</id>
    <name>Aspose Java API</name>
    <url>https://repository.aspose.com/repo/</url>
</repository>
<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-font</artifactId>
    <version>20.10</version>
</dependency>

Implementare il metodo di rendering del testo

Per eseguire il rendering del testo, Aspose.Font per Java richiede l’implementazione del metodo drawText() che disegnerà il testo fornito. Quella che segue è la definizione completa del metodo drawText().

// Per esempi completi e file di dati, vai a https://github.com/aspose-font/Aspose.Font-for-Java
static void drawText(String text, IFont font, double fontSize,
           Paint backgroundBrush, Paint textBrush, String outFile) throws Exception
{
    //Ottieni identificatori di glifi per ogni simbolo nella riga di testo
    GlyphId[] gids = new GlyphId[text.length()];
    for (int i = 0; i < text.length(); i++)
        gids[i] = font.getEncoding().decodeToGid(text.charAt(i));
    // impostare le impostazioni di disegno comuni
    double dpi = 300;
	
    double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
    // preparare la bitmap di output
    BufferedImage outBitmap = new BufferedImage(960, 720, BufferedImage.TYPE_INT_BGR);
    //outBitmap.getRaster().SetResolution((float)dpi, (float)dpi);
    java.awt.Graphics2D outGraphics = (java.awt.Graphics2D) outBitmap.getGraphics();
    outGraphics.setPaint(backgroundBrush);
    outGraphics.fillRect(0, 0, outBitmap.getWidth(), outBitmap.getHeight());
    outGraphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    //dichiarare le variabili coordinate e il gid precedente
    GlyphId previousGid = null;
    double glyphXCoordinate = 0;
    double glyphYCoordinate = fontSize * resolutionCorrection;
    //loop che dipinge ogni glifo in gid
    for (GlyphId gid : gids)
    {
        // se il font contiene il gid
        if (gid != null)
        {
            Glyph glyph = font.getGlyphAccessor().getGlyphById(gid);
            if (glyph == null)
                continue;
	
            // percorso che accetta le istruzioni di disegno
            GeneralPath path = new GeneralPath();
	
            // Crea l'implementazione di IglyphOutlinePainter
            GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);
	
            // Crea il renderer
            IGlyphRenderer renderer = new GlyphOutlineRenderer(outlinePainter);
	
            // ottenere le proprietà comuni dei glifi
            double kerning = 0;
	
            // ottenere valore di crenatura
            if (previousGid != null)
            {
                kerning = (font.getMetrics().getKerningValue(previousGid, gid) /
                           glyph.getSourceResolution()) * fontSize * resolutionCorrection;
                kerning += fontWidthToImageWdith(font.getMetrics().getGlyphWidth(previousGid),
                        glyph.getSourceResolution(), fontSize, 300);
            }
	
            // posizionamento del glifo - aumenta la coordinata X del glifo in base alla distanza di crenatura
            glyphXCoordinate += kerning;
	
            // Matrice di posizionamento dei glifi
            TransformationMatrix glyphMatrix =
                new TransformationMatrix(
                    new double[]
                            {
                                    fontSize*resolutionCorrection,
                                    0,
                                    0,
                                // negativo a causa del sistema di coordinate bitmap inizia dall'alto
                                    - fontSize*resolutionCorrection,
                                    glyphXCoordinate,
                                    glyphYCoordinate
                            });
	
            // renderizza il glifo corrente
            renderer.renderGlyph(font, gid, glyphMatrix);
            // riempire il percorso
            path.setWindingRule(GeneralPath.WIND_NON_ZERO);
            outGraphics.setPaint(textBrush);
            outGraphics.fill(path);
        }
        //imposta gid corrente come precedente per ottenere la crenatura corretta per il prossimo glifo
        previousGid = gid;
    }
    //Salva i risultati
    ImageIO.write(outBitmap, "jpg", new File(outFile));
}

Di seguito è riportato un metodo di utilità utilizzato per calcolare la larghezza del glifo per il sistema di coordinate bitmap.

// Per esempi completi e file di dati, vai a https://github.com/aspose-font/Aspose.Font-for-Java
static double fontWidthToImageWidth(double width, int fontSourceResulution, double fontSize, double dpi)
{
    double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
    return (width / fontSourceResulution) * fontSize * resolutionCorrection;
}

Passaggi per il rendering di testo con font in Java

Di seguito sono riportati i passaggi su come eseguire il rendering di un testo specificato come file immagine utilizzando il metodo darwText() sopra menzionato.

  • Carica il carattere usando la classe FontDefinition.
  • Accedi al carattere utilizzando la classe come Type1Font o TtfFont.
  • Chiama il metodo drawText() fornendo i dettagli sotto forma dei suoi parametri.

Rendering di testo con font TrueType utilizzando Java

Nell’esempio di codice seguente viene illustrato come utilizzare il metodo drawText() per eseguire il rendering del testo utilizzando un carattere TrueType. I risultati del rendering verranno generati come immagine JPEG.

// Per esempi completi e file di dati, vai a https://github.com/aspose-font/Aspose.Font-for-Java
String fileName1 = Utils.getDataDir() + "Montserrat-Bold.ttf"; //Font file name with full path
      FontDefinition fd1 = new FontDefinition(FontType.TTF, new FontFileDefinition("ttf", new FileSystemStreamSource(fileName1)));
      TtfFont font1 = (TtfFont) Font.open(fd1);
      
      String fileName2 = Utils.getDataDir() + "Lora-Bold.ttf"; //Font file name with full path
      FontDefinition fd2 = new FontDefinition(FontType.TTF, new FontFileDefinition("ttf", new FileSystemStreamSource(fileName2)));
      TtfFont font2 = (TtfFont) Font.open(fd2);
      
      try {
       drawText("Hello world", font1, 14, java.awt.Color.WHITE, java.awt.Color.BLACK, Utils.getDataDir() + "hello1_montserrat_out.jpg");
       drawText("Hello world", font2, 14, java.awt.Color.YELLOW, java.awt.Color.RED, Utils.getDataDir() + "hello2_lora_out.jpg");
      } catch (Exception ex) {
      	ex.printStackTrace();
      }

Rendering di testo utilizzando i caratteri Type1 in Java

L’esempio di codice seguente mostra come eseguire il rendering del testo in un’immagine JPEG con un carattere Type1 utilizzando Java.

// Per esempi completi e file di dati, vai a https://github.com/aspose-font/Aspose.Font-for-Java
String fileName = Utils.getDataDir() + "courier.pfb"; //Font file name with full path

FontDefinition fd = new FontDefinition(FontType.Type1, new FontFileDefinition("pfb", new FileSystemStreamSource(fileName)));
      Type1Font font = (Type1Font) Font.open(fd);
      
      try {
       drawText("Hello world", font, 14, java.awt.Color.WHITE, java.awt.Color.BLACK, Utils.getDataDir() + "hello1_type1_out.jpg");
       drawText("Hello world", font, 14, java.awt.Color.YELLOW, java.awt.Color.RED, Utils.getDataDir() + "hello2_type1_out.jpg");
      } catch (Exception ex) {
      	ex.printStackTrace();
      }

Conclusione

In questo articolo, hai visto come eseguire il rendering del testo come immagini JPEG utilizzando il font TrueType o Type1 dall’interno delle applicazioni Java. Per saperne di più sull’API di manipolazione dei caratteri Java, puoi visitare la documentazione e valutare le funzionalità dell’API utilizzando campioni di codice sorgente.