使用JavaFX创建一个TrueType字体文件

34

我有一个canvas,要求用户绘制字母A-Z、a-z或数字0-9。一旦用户绘制了一个字符比如A,当前的canvas对象就会被保存在一个canvas列表中;然后另一个空白的canvas弹出来,让用户绘制B,以此类推。

这个程序运行得很好。但是我想创建一个包含所有接受绘制字符的.ttf文件。

在最后一个显示的canvas下面,我有一个按钮,当点击它时,将从canvas列表中提取所有字符,并从中创建一个.ttf文件。但怎么做呢?


8
您可以看一下Fontastic,这是一个用于创建字体文件(包括.ttf文件中的TrueType字体)的Java库。 Fontastic本身使用库[doubletype](http://sourceforge.net/projects/doubletype/)创建TrueType字体。虽然我不太熟悉这些库...... - Cyäegha
它能否从我用表格格式写下所有字符的纸张中检测出我的手写? - Aditya Singh
1
这个库的目的是从头开始创建字体(通过定义任何你想要的矢量图形)或修改另一个已经处于矢量格式中的字体。它不会将位图图像(如扫描的纸张)转换为矢量字体。我知道一些矢量图形编辑器(如Inkscape)提供工具来帮助将位图转换为矢量图形,一些网站(如免费的myscriptfont)提供将手写字体转换为TrueType字体,所以这肯定是可行的,但我不知道是否有这样的工具作为Java库可用。 - Cyäegha
我知道myscriptfont.com网站。但即使是该网站也会将“png”图像转换为“rtf”。它是如何做到的?有任何想法吗? - Aditya Singh
2个回答

4

我使用过这个库: Fontastic字体制作器

它的工作原理如下:

如何创建一个新的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

3

第一种解决方案:

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

Font(String name, int style, int size):

从指定的名称、样式和点大小创建新字体。字体名称可以是字体面名或字体系列名。它与样式一起用于查找适当的字体面。当指定字体系列名称时,样式参数用于从系列中选择最合适的字体面。当指定字体面名称时,将合并面的样式和样式参数以从同一系列中定位最佳匹配字体。

例如,如果指定面名为“Arial Bold”和样式Font.ITALIC,则字体系统会在“Arial”系列中查找加粗和斜体的字体面,并可能将字体实例与物理字体面“Arial Bold Italic”相关联。样式参数与指定面的样式合并,而不是添加或减去。这意味着,指定粗体面和粗体样式不会使字体加倍加粗,指定粗体面和普通样式不会使字体变亮。

参数:

name - 字体名称。这可以是字体面名称或字体系列名称,并且可以表示此GraphicsEnvironment中找到的逻辑字体或物理字体。逻辑字体的家族名称为:Dialog、DialogInput、Monospaced、Serif或SansSerif。对于所有这些名称都有预定义的String常量,例如DIALOG。如果name为null,则将新Font的逻辑字体名称设置为getName()返回的名称“Default”。

style - Font的样式常数。样式参数是一个整数位掩码,可以是PLAIN,也可以是BOLD和/或ITALIC的按位联合(例如ITALIC或BOLD|ITALIC)。如果样式参数不符合预期的整数位掩码之一,则样式设置为PLAIN。

size - 字体大小。

正如您所看到的,它允许您基于现有字体创建新字体,您还可以更改样式和大小。

这是教程,您可以按照其进行操作。


第二种解决方案:

如评论中所述,您也可以使用 Fontastic 库,这似乎是一个非常好的用于创建新字体的工具。它允许您基于数据、传感器、实时信息或任何其他算法来制作字体,或者操作现有字体以创建自己的版本。
以下是展示其如何工作的基本步骤。有关完整参考,请参阅文档
如何创建一个新的 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();

              

您可以查看他们的示例


结论:

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

  1. 使用另一个工具将您的图像转换为矢量图形(Vector MagicInkscapemyScriptFont.com

  2. 然后使用生成的矢量创建您的字体


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接