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.
- Tentang API Manipulasi Font Java
- Menerapkan Metode Rendering Teks
- Render Teks menggunakan TrueType Fonts di Java
- Render Teks menggunakan Font Type1 di Java
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.