使用 javafx 创建 Truetype 字体文件第一个解决方案:第二种解决方案:结论:

2022-09-01 07:54:34

我有一块画布。它要求用户从 A-Z、a-z 或 0-9 中绘制一个字符。一旦用户绘制一个字符说A,当前的画布对象就会保存在画布的数组列表中。并弹出另一个空白画布,要求用户绘制 B.,依此类推。

程序工作正常。但是我想创建一个包含所有接受字符的文件。.ttf

我在上次显示的画布下面有一个按钮,单击该按钮时,将从画布数组列表中提取所有字符并从中创建一个文件。但是如何做到呢?.ttf


答案 1

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

这就是它的工作原理:

如何创建新的 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(字符串名称,int样式,int大小)构造函数来创建自定义字体:

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

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

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

参数:

名称 - 字体名称。这可以是字体名称或字体系列名称,并且可以表示逻辑字体或在此图形环境中找到的物理字体。逻辑字体的系列名称包括:Dialog、DialogInput、Monospaced、Serif 或 SansSerif。所有这些名称都存在预定义的字符串常量,例如,DIALOG。如果 name 为 null,则 getName() 返回的新字体的逻辑字体名称将设置为名称“Default”。

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

size - Fon 的点大小

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

这是您可以遵循的教程


第二种解决方案:

如注释中所述,您还可以使用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 MagicInkscape myScriptFont.com)

  2. 然后使用生成的 .Fontvectors


推荐