如何从具有多个 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
来确认使用了正确的文件。
我还测试了 italic 和 bold italic,两者都和 Font#createFont(int, InputStream)
方法一样好。
上述方法有效,因为字体是按其全名映射的(例如 Arial、Arial Bold 等),因此只要您的字体名称正确,您就可以注册一个家族的多个成员。
【讨论】:
以上是关于如何从具有多个 TTF 文件的字体系列导入自定义 java.awt.Font? (包括一个例子)的主要内容,如果未能解决你的问题,请参考以下文章