使用javafx创建Truetype字体文件

时间:2014-10-13 04:09:34

标签: java fonts javafx-8 true-type-fonts

我有画布。它要求用户从A-Z,a-z或0-9中绘制一个角色。一旦用户绘制了一个字符A,则当前画布对象将保存在画布的arraylist中。弹出另一个空白画布,要求用户绘制B.等等。

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

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

2 个答案:

答案 0 :(得分:4)

我使用过这个库: 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

答案 1 :(得分:3)

第一个解决方案:

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

  

字体(String name,int style,int size):

     

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

     

例如,如果使用样式指定了面部名称“Arial Bold”   Font.ITALIC,字体系统在“Arial”系列中查找面部   这是粗体和斜体,并可能将字体实例与   物理字体“Arial Bold Italic”。 style参数已合并   具有指定面部的样式,不添加或减去。这意味着,   指定粗体和粗体样式并不会使双重壮观   字体,并指定粗体和普通样式不会变亮   字体。

     

参数:

     

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

     

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

     

size - Fon的磅值

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

您可以关注此a Tutorial

第二个解决方案:

如评论中所述,您还可以使用 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将不允许您从图像创建字体,但它使用矢量图形来创建字体,因此在这种情况下解决方案是:

  1. 使用其他工具将图片转换为矢量( Vector Magic Inkscape {{3} }

  2. 然后使用生成的Font创建vectors