使用 javafx 创建 Truetype 字体文件

Posted

技术标签:

【中文标题】使用 javafx 创建 Truetype 字体文件【英文标题】:Creating a Truetype Font file with javafx 【发布时间】:2014-12-07 14:11:54 【问题描述】:

我有一个画布。它要求用户从 A-Z、a-z 或 0-9 中绘制一个字符。一旦用户绘制了一个字符,比如 A,当前的画布对象就会保存在一个画布数组列表中。然后弹出另一个空白画布,要求用户绘制 B。等等。

程序运行良好。但我想创建一个.ttf 文件,其中包含所有接受的字符。

我在最后一个显示的画布下方有一个按钮,单击该按钮时,将从画布的数组列表中提取所有字符并从中创建一个.ttf 文件。但是怎么做?

【问题讨论】:

您可能想看看Fontastic,这是一个用于创建字体文件(包括 .ttf 文件中的 truetype 字体)的 Java 库。 Fontastic 本身使用库doubletype 来创建truetype 字体。不过,我对这些库并不是特别熟悉...... 它能从一张我以表格格式写下所有字符的纸上检测到我自己的笔迹吗? 这个库的重点是从头开始创建字体(通过定义你想要的任何矢量图形)或修改另一种字体(已经是矢量格式)。它不会将位图图像(如扫描的纸)转换为矢量字体。我知道一些矢量图形编辑器(如 Inkscape)提供了帮助将位图转换为矢量的工具,而一些网站(如免费的myscriptfont)提供了将手写内容转换为 truetype 字体的功能,所以这当然是可行的——但我不知道任何可用作 Java 库的此类工具。 是的,我知道 myscriptfont.com。但即使是那个网站也将png 图像转换为rtf。它是怎么做的?有什么想法吗? 【参考方案1】:

我使用过这个库: fontastic font maker

这就是它的工作原理:

如何创建一个新的 Fontastic 对象:

Fontastic f = new Fontastic(this, "ExampleFont");  // Create a new Fontastic object

如何设置更多字体属性:

f.setAuthor("Andreas Koller");                  // Set author name - will be saved in TTF file too

如何为字符 A 创建一个具有四个点的随机形状的字形(这里将是您之前从用户那里收集的点(或标准化点)):

PVector[] points = new PVector[4];              // Define a PVector array containing the points of the shape
points[0] = new PVector(0, 0);                  // Start at bottom left
points[1] = new PVector(random(512), 0);        // The normal width is 512, the normal height 1024
points[2] = new PVector(random(512), random(1024)); // y coordinates are from bottom to top!
points[3] = new PVector(0, random(1024));

f.addGlyph('A').addContour(points);             // Assign contour to character A

如何生成TrueType字体文件:

f.buildFont();                                  // Build the font resulting in .ttf and .woff files
                                                // and a html template to preview the WOFF

【讨论】:

【参考方案2】:

第一个解决方案:

您可以使用java.awt.Font,它是一个用于管理和创建字体的Java类,您可以使用它的Font(String name, int style, int size)构造函数来创建您的自定义字体:

字体(字符串名称、int 样式、int 大小):

根据指定的名称、样式和磅值创建一个新字体。 字体名称可以是字体名称或字体系列名称。它是 与样式一起使用以找到合适的字体。当一个 指定字体系列名称,样式参数用于选择 家庭中最合适的面孔。当字体名称为 指定时,面的样式和样式参数合并为 从同一系列中找到最匹配的字体。

例如,如果用样式指定了面名“Arial Bold” Font.ITALIC,字体系统在“Arial”家族中寻找一张脸 这是粗体和斜体,并且可以将字体实例与 物理字体“Arial Bold Italic”。样式参数被合并 具有指定面的样式,不加也不减。这意味着, 指定一个大胆的面孔和一个大胆的风格不会双重鼓励 字体,并指定粗体和普通样式不会变亮 字体。

参数:

name - 字体名称。这可以是字体名称或字体系列名称,可以表示逻辑字体或 在此 GraphicsEnvironment 中找到的物理字体。姓氏为 逻辑字体为:Dialog、DialogInput、Monospaced、Serif 或 无衬线字体。所有这些名称都存在预定义的字符串常量, 例如,对话。如果 name 为 null,则新的逻辑字体名称 getName() 返回的字体设置为名称“默认”。

风格 - 字体的样式常量样式参数是一个整数 可能是 PLAIN 的位掩码,或 BOLD 和/或 ITALIC 的按位联合 (例如,斜体或粗体|斜体)。如果样式参数不 符合预期的整数位掩码之一,然后设置样式 到平原。

size - 字体的磅值

如您所见,它允许您根据现有字体创建新字体,您还可以更改样式和大小。

这是您可以关注的a Tutorial。


第二种解决方案:

如 cmets 中所述,您还可以使用 Fontastic 库,这似乎是创建新字体的好工具,它允许您根据数据、传感器、实时提要制作字体,或任何其他算法,或操纵现有字体来创建您自己的版本。

这些是向您展示其工作原理所需的基本步骤。如需完整参考,请参阅Documentation。

如何创建一个新的 Fontastic 对象:

Fontastic f = new Fontastic(this, "ExampleFont");  // Create a new Fontastic object

如何设置更多字体属性:

f.setAuthor("Andreas Koller"); 
           

如何为字符 A 创建一个具有四点随机形状的字形:

PVector[] points = new PVector[4];              // Define a PVector array containing the points of the shape
points[0] = new PVector(0, 0);                  // Start at bottom left
points[1] = new PVector(random(512), 0);        // The normal width is 512, the normal height 1024
points[2] = new PVector(random(512), random(1024)); // y coordinates are from bottom to top!
points[3] = new PVector(0, random(1024));

f.addGlyph('A').addContour(points);

         

如何生成TrueType字体文件:

f.buildFont();  

                            
                                            

事后如何清理:

f.cleanup();

              

你可以看到their examples


结论:

但是在这两种情况下,您将无法从手写扫描图像创建字体,Fantastic 不允许您从图像创建字体,但它使用矢量图形创建字体,因此在这种情况下解决方案将是:

    使用其他工具将图像转换为矢量(Vector MagicInkscapemyScriptFont.com

    然后使用生成的vectors 创建您的Font

【讨论】:

以上是关于使用 javafx 创建 Truetype 字体文件的主要内容,如果未能解决你的问题,请参考以下文章

TrueType 和 OpenType 字体是不是应该转换为 WOFF 以便在 Web 上使用?

TrueType字体文件提取关键信息

libGDX 中的 TrueType 字体

TrueType字体文件提取关键信息

TrueType字体文件提取关键信息

Office PPT保持提示无法保存Gill Sans 等非TrueType字体