如何从具有多个 TTF 文件的字体系列导入自定义 java.awt.Font? (包括一个例子)

Posted

技术标签:

【中文标题】如何从具有多个 TTF 文件的字体系列导入自定义 java.awt.Font? (包括一个例子)【英文标题】:How to import a custom java.awt.Font from a Font family with multiple TTF files? (An example is included) 【发布时间】:2014-09-08 04:02:06 【问题描述】:

我知道你可以用这样的方式在 Java 中导入字体:

File file = new File(fontPath);
Font font = Font.createFont(Font.TRUETYPE_FONT, file);
// alternative:
// Font font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream(file));
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(font);

然后您将使用例如font.deriveFont(Font.PLAIN, 20); 来获得所需的样式和大小。


示例

但现在让我们以字体Consolas 为例,您有四个TTF 文件:

consola.ttf(普通) consolab.ttf(粗体) consolai.ttf(斜体) consolaz.ttf(粗体和斜体)

当然你可以用上述方法导入consola.ttf,但是使用font.deriveFont(Font.BOLD, 20);与使用consolab.ttf不一样,因为普通字体只是简单地转换为看起来像 粗体字。


示例图片

    这里我使用了new Font("Consolas", Font.PLAIN, 20);new Font("Consolas", Font.BOLD, 20);安装的字体(作为旁注,如果系统上安装了字体,如果你使用deriveFont(Font.BOLD);,你也会得到正确的粗体字体):

    这是consola.ttf,使用createFont 和派生的粗体字导入(均使用20 号,如上例):


好吧,安装后没问题,但我不希望其他人有自定义字体,所以我想将 TTF 放入 jar 文件中,以便在初始化期间通过 @987654338 导入它们@。

有没有办法导入所有相关的 TTF,然后只需调用new Font("Custom Font Name", fontStyle, fontSize);,这样它就可以像安装的字体一样使用(图 1),并且它看起来不像派生的“假”粗体字体(图 2 )?

【问题讨论】:

2周多还是没有答案:( 好问题,我也在寻找这个问题的答案 是的,遇到了类似的问题。我知道有点晚了,但 Consolas 中的字体系列名称不同吧? 【参考方案1】:

我不确定到底是什么问题。你得到了所有的 TTF 文件,你必须导入并注册它们。以下测试使用我的系统上未安装的 DejaVu Sans 字体。


测试 1

Font f = Font.createFont(Font.TRUETYPE_FONT, new File("dvs.ttf"));

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(f);

Font dvs = new Font("DejaVu Sans", Font.PLAIN, 20);

这是一张带有普通 (dvs) 和派生 bold (dvs.deriveFont(Font.BOLD)) 字体的图片。

测试 2

Font f = Font.createFont(Font.TRUETYPE_FONT, new File("dvs.ttf"));
Font fb = Font.createFont(Font.TRUETYPE_FONT, new File("dvsb.ttf"));

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(f);
ge.registerFont(fb);

Font dvs = new Font("DejaVu Sans", Font.PLAIN, 20);
Font dvsb = new Font("DejaVu Sans", Font.BOLD, 20);

这是一张带有纯 (dvs) 和真正 bold (dvsb) 字体的图片。

您可以通过查看font2DHandle 来确认使用了正确的文件。


我还测试了 italicbold italic,两者都和 Font#createFont(int, InputStream) 方法一样好。

上述方法有效,因为字体是按其全名映射的(例如 Arial、Arial Bold 等),因此只要您的字体名称正确,您就可以注册一个家族的多个成员。

【讨论】:

以上是关于如何从具有多个 TTF 文件的字体系列导入自定义 java.awt.Font? (包括一个例子)的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter / dart中使用具有设定大小的自定义字体?

如何在 Xamarin 中使用 CSS 设置自定义字体系列

如何从 OTF、TTF 文件中查找字体版本

如何从 otf 或 ttf 文件中获取字体名称?

如何在 GTK 应用程序中使用自定义字体

iOS开发之APP导入添加自定义字体