merender teks menggunakan font di Jawa

Pada artikel sebelumnya, Anda telah melihat cara memuat font CFF, TrueType dan Type1 secara terprogram menggunakan Java. Hari ini, kita akan membahas fitur menarik lainnya dari API manipulasi font Java kita - merender teks menggunakan font. Di akhir artikel ini, Anda akan dapat merender teks menggunakan font TrueType dan Type1 dari dalam aplikasi Java Anda. Jadi ayo mulai.

API Manipulasi Font Java

Aspose.Font for Java memberi Anda fitur memuat dan menyimpan font serta mendapatkan metrik jenis font populer termasuk CFF, TrueType, OpenType, dan Type1. Selain itu, API memungkinkan Anda merender teks menggunakan font TrueType atau Type1 yang disediakan. Anda dapat menginstal API menggunakan konfigurasi Maven atau mengunduh JAR 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>

Menerapkan Metode Rendering Teks

Untuk merender teks, Aspose.Font for Java mengharuskan Anda mengimplementasikan metode drawText() yang akan menggambar teks yang disediakan. Berikut ini adalah definisi lengkap dari metode drawText().

// Untuk contoh lengkap dan file data, silakan buka 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
{
    //Dapatkan pengenal mesin terbang untuk setiap simbol di baris teks
    GlyphId[] gids = new GlyphId[text.length()];
   for (int i = 0; i < text.length(); i++)
        gids[i] = font.getEncoding().decodeToGid(text.charAt(i));
    // mengatur pengaturan gambar umum
    double dpi = 300;
	
    double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
    // menyiapkan bitmap keluaran
    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);
    //mendeklarasikan variabel koordinat dan gi sebelumnya
    GlyphId previousGid = null;
    double glyphXCoordinate = 0;
    double glyphYCoordinate = fontSize * resolutionCorrection;
    //loop yang melukis setiap mesin terbang di gids
   for (GlyphId gid : gids)
    {
        // jika font berisi gid
        if (gid != null)
        {
            Glyph glyph = font.getGlyphAccessor().getGlyphById(gid);
            if (glyph == null)
                continue;
	
            // jalur yang menerima instruksi menggambar
            GeneralPath path = new GeneralPath();
	
            // Buat implementasi IGlyphOutlinePainter
            GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);
	
            // Buat perender
            IGlyphRenderer renderer = new GlyphOutlineRenderer(outlinePainter);
	
            // dapatkan properti mesin terbang umum
            double kerning = 0;
	
            // mendapatkan nilai kerning
            if (previousGid != null)
            {
                kerning = (font.getMetrics().getKerningValue(previousGid, gid) /
                           glyph.getSourceResolution()) * fontSize * resolutionCorrection;
                kerning += fontWidthToImageWdith(font.getMetrics().getGlyphWidth(previousGid),
                        glyph.getSourceResolution(), fontSize, 300);
            }
	
            // posisi mesin terbang - tingkatkan koordinat mesin terbang X sesuai dengan jarak kerning
            glyphXCoordinate += kerning;
	
            // Matriks penempatan mesin terbang
            TransformationMatrix glyphMatrix =
                new TransformationMatrix(
                    new double[]
                            {
                                    fontSize*resolutionCorrection,
                                    0,
                                    0,
                                // negatif karena sistem koordinat bitmap dimulai dari atas
                                    - fontSize*resolutionCorrection,
                                    glyphXCoordinate,
                                    glyphYCoordinate
                            });
	
            // membuat mesin terbang saat ini
            renderer.renderGlyph(font, gid, glyphMatrix);
            // mengisi jalan
            path.setWindingRule(GeneralPath.WIND_NON_ZERO);
            outGraphics.setPaint(textBrush);
            outGraphics.fill(path);
        }
        //atur gid saat ini seperti sebelumnya untuk mendapatkan kerning yang benar untuk mesin terbang berikutnya
        previousGid = gid;
    }
    //Simpan hasil
    ImageIO.write(outBitmap, "jpg", new File(outFile));
}

Berikut ini adalah metode utilitas yang digunakan untuk menghitung lebar mesin terbang untuk sistem koordinat bitmap.

// Untuk contoh lengkap dan file data, silakan buka 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;
}

Langkah-langkah Render Teks dengan Font di Java

Berikut ini adalah langkah-langkah cara merender teks tertentu sebagai file gambar menggunakan metode darwText() yang disebutkan di atas.

  • Muat font menggunakan kelas FontDefinition.
  • Akses font menggunakan kelas seperti Type1Font atau TtfFont.
  • Panggil metode drawText() dengan memberikan detail dalam bentuk parameternya.

Render Teks dengan TrueType Font menggunakan Java

Contoh kode berikut menunjukkan cara menggunakan metode drawText() untuk merender teks menggunakan font TrueType. Hasil rendering akan dihasilkan sebagai gambar JPEG.

// Untuk contoh lengkap dan file data, silakan buka 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();
      }

Render Teks menggunakan Font Type1 di Java

Contoh kode berikut menunjukkan cara merender teks ke gambar JPEG dengan font Type1 menggunakan Java.

// Untuk contoh lengkap dan file data, silakan buka 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();
      }

Kesimpulan

Dalam artikel ini, Anda telah melihat cara merender teks sebagai gambar JPEG menggunakan font TrueType atau Type1 dari dalam aplikasi Java. Untuk mempelajari lebih lanjut tentang API manipulasi font Java, Anda dapat mengunjungi dokumentasi dan mengevaluasi fitur API menggunakan contoh kode sumber.