首页 \ 问答 \ 用javafx创建一个Truetype字体文件(Creating a Truetype Font file with javafx)

用javafx创建一个Truetype字体文件(Creating a Truetype Font file with javafx)

我有一个画布。 它要求用户从AZ,az或0-9中绘制一个字符。 一旦用户画一个字符说A,当前画布对象被保存在画布的数组列表中。 另一个空白画布弹出,要求用户画B.等等。

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

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


I have a canvas. It asks the user to draw a character from A-Z, a-z or 0-9. once the user draws a character say A, the current canvas object is saved in an arraylist of canvases. and another blank canvas pops up that asks the user to draw B. and so on.

The programs works fine. But I want to create a .ttf file with all the accepted characters drawn.

I have a button below the last displayed canvas which when clicked, will extract all chars from the arraylist of canvases and create a .ttf file from it. But how?


原文:https://stackoverflow.com/questions/26332766
更新时间:2019-07-08 13:39

最满意答案

第一解决方案

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

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

从指定的名称,样式和磅值中创建一个新的字体。 字体名称可以是字体名称或字体系列名称。 它与风格一起使用以找到合适的字体。 当指定字体系列名称时,style参数用于从系列中选择最合适的面。 当指定字体名称时,会合并面部的样式和样式参数,以找到来自同一族的最佳匹配字体。

例如,如果使用样式Font.ITALIC指定了名称“Arial Bold”,则字体系统会在“Arial”系列中查找粗体和斜体中的一个面,并且可能会将字体实例与物理字体面“Arial Bold斜体”。 样式参数与指定的人脸样式合并,不添加或减少。 这意味着,指定粗体和粗体不会增加字体的粗体,并且指定粗体和粗体不会减淡字体。

参数:

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

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

大小 - Fon的磅值

正如你所看到的,它允许你根据现有的字体创建新的字体,你也可以改变风格和大小。

这是您可以遵循的教程


第二个方案

正如评论中所述,您还可以使用Fontastic Library,它似乎是创建新字体的好工具,它允许您根据数据,传感器,实时馈送或任何其他算法制作字体,或者操纵现有的字体来创建你自己的版本。

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

如何创建一个新的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. 然后使用生成的vectors创建您的Font


First Solution:

You can use the java.awt.Font, it is a Java class used to manage and create Fonts, you can use its Font(String name, int style, int size) constructor to create your custom Font:

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

Creates a new Font from the specified name, style and point size. The font name can be a font face name or a font family name. It is used together with the style to find an appropriate font face. When a font family name is specified, the style argument is used to select the most appropriate face from the family. When a font face name is specified, the face's style and the style argument are merged to locate the best matching font from the same family.

For example if face name "Arial Bold" is specified with style Font.ITALIC, the font system looks for a face in the "Arial" family that is bold and italic, and may associate the font instance with the physical font face "Arial Bold Italic". The style argument is merged with the specified face's style, not added or subtracted. This means, specifying a bold face and a bold style does not double-embolden the font, and specifying a bold face and a plain style does not lighten the font.

Parameters:

name - the font name. This can be a font face name or a font family name, and may represent either a logical font or a physical font found in this GraphicsEnvironment. The family names for logical fonts are: Dialog, DialogInput, Monospaced, Serif, or SansSerif. Pre-defined String constants exist for all of these names, for example, DIALOG. If name is null, the logical font name of the new Font as returned by getName() is set to the name "Default".

style - the style constant for the Font The style argument is an integer bitmask that may be PLAIN, or a bitwise union of BOLD and/or ITALIC (for example, ITALIC or BOLD|ITALIC). If the style argument does not conform to one of the expected integer bitmasks then the style is set to PLAIN.

size - the point size of the Fon

And as you can see it allows you to create new Fonts depending on existing fonts, you can also change the style and the size.

This is a Tutorial that you can follow.


Second Solution:

As stated in comments, you can also use the Fontastic Library which seems to be a great tool for creating new Fonts, It allows you to make fonts based on data, sensors, live feeds, or any other algorithm, or manipulate existing fonts to create your own version.

These are the basic steps needed to show you how it works. For a full reference see the Documentation.

How to create a new Fontastic object:

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

How to set further font properties:

f.setAuthor("Andreas Koller"); 

How to create a glyph for the character A with a random shape of four points:

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);

How to generate the TrueType font file:

f.buildFont();  

How to clean up afterwards:

f.cleanup();

You can see their examples.


Conclusion:

But in the two cases you will not be able to create Fonts from handwritten scanned images, Fantastic won't allow you to create a Font from images but it uses vector graphics to create Fonts, so in this case the solution would be :

  1. To use another tool to convert your images to vectors (Vector Magic, Inkscape, myScriptFont.com)

  2. Then create your Font using the generated vectors.

2015-08-24

相关问答

更多

Unicode字符如何映射到字体中的字形?(How does a Unicode character get mapped to a glyph in a font?)

TrueType字体由许多部分组成,对于这个问题最重要的是一个“字形”表和一个表(“cmap”),用于将字符映射到这些字形。 长话短说,操作系统使用“cmap”表将字符转换为字形索引,用默认字形替换没有匹配条目的字符。 不幸的是,字体文件规范有多种版本(更不用说不同类型的字体)以及这些表中相同映射的不同字符编码,因此实际执行映射的过程以及高效地执行,以便文本绘制速度很快,最终变得非常复杂。 “代码点”完全独立于字符,编码和字体。 一个特定的代码点是通用的,但它有很多编码(UTF-8,UTF-16等 ...

设置自定义字体(Setting custom font)

首先获取Font的URL 。 然后做这样的事情。 'Airacobra Condensed'字体可从Download Free Fonts下载 。 import java.awt.*; import javax.swing.*; import java.net.URL; class LoadFont { public static void main(String[] args) throws Exception { // This font is < 35Kb. ...

TrueType,PostScript 和 OpenType 字体之间的区别是什么

TrueType是由AppleComputer公司和Microsoft公司联合提出的一种新型数学字形描述技术。它用数学函数描述字体轮廓外形,含有字形构造、颜色填充、数字描述函数、流程条件控制、栅格处理控制、附加提示控制等指令。TrueType采用几何学中二次B样条曲线及直线来描述字体的外形轮廓,其特点是:TrueType既可以作打印字体,又可以用作屏幕显示;由于它是由指令对字形进行描述,因此它与分辨率无关,输出时总是按照打印机的分辨率输出。无论放大或缩小,字符总是光滑的,不会有锯齿出现。但相对Po ...

JavaFX - 无法从FXML文件加载节点[重复](JavaFX - Can't load node from FXML file [duplicate])

FXMLLoader.load创建Test类的新实例。 所以这和你现在的班级不一样。 用户使用FXMLLoader类的setControllerFactory方法来更改此行为。 FXMLLoader.load creates a new instance of your Test class. So this will not be the same as your current class. User the setControllerFactory method of the FXMLLoa ...

Javafx 8 - setVisible()被阻止(Javafx 8 - setVisible() is blocked)

在用户kleopatra在评论中的一些帮助中,我来自oracle的以下链接: https://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm 基本上我的问题总结如下: JavaFX场景图表示JavaFX应用程序的图形用户界面,它不是线程安全的,只能从UI线程(也称为JavaFX Application线程)访问和修改。 在JavaFX Application线程上实现长时间运行的任务不可避免地使应用程序UI无响应 。 最佳实践是在一个或多个后 ...

如何在JSF中使用Font Awesome 4.x CSS文件?(How to use Font Awesome 4.x CSS file with JSF? Browser can't find font files)

Font Awesome CSS文件默认是通过一个相对路径来引用这些字体文件../就像下面这样: @font-face { font-family: 'FontAwesome'; src: url('../fonts/fontawesome-webfont.eot?v=4.3.0'); src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'), url(' ...

来自Main的Controller类中的JavaFX访问函数(JavaFX Access Function in Controller Class from Main)

在调用new Controller()时,您正在创建第二个Controller实例。 当然,这不是FXMLLoader在加载FXML文件时创建的Controller实例,因此它不会初始化任何@FXML字段。 您需要从FXMLLoader获取Controller实例: package sample ; import javafx.application.Application; import javafx.application.Platform; import javafx.fxml.FXMLL ...

多个字体权重,一个@ font-face查询(Multiple font-weights, one @font-face query)

实际上,@ font-face有一种特殊的风格,它将允许你正在询问的内容。 以下是使用相同字体系列名称以及不同字体和不同字体的示例的示例: @font-face { font-family: 'DroidSerif'; src: url('DroidSerif-Regular-webfont.ttf') format('truetype'); font-weight: normal; font-style: normal; } @font-face { font-family: 'DroidSer ...

相关文章

更多

最新问答

更多
  • Android宽度:100%修复(网站接管问题)(Android width:100% fix (website takeover issue))
  • C ++函数/方法设计的良好实践(Good practice in C++ function/method design)
  • 计算其他表中不存在的所有记录 - SQL查询(Count all records that does not exist to other table - SQL Query)
  • 为什么我要用JPA共享ID?(Why do I get shared Ids with JPA?)
  • asp.net - 如何显示来自html格式的数据行的字段(asp.net - how to display a field from data row that is in html format)
  • 我们如何使用ActiveRecord从连接表中删除行?(How can we delete rows from a join table by using ActiveRecord?)
  • ng-class搞乱了类的顺序(ng-class messing with the order of classes)
  • oracle 12g无效数字错误(oracle 12g invalid number error)
  • 更改ng-src值onclick(Change ng-src value onclick)
  • 如何在android中自动添加自定义依赖项以创建新项目?(How to add custom dependencies automatically in android for ever a new project is created?)
  • datetime函数在PHP中(datetime function in php)
  • 在javascript中获取会话数组的值(in javascript get the value of a session array)
  • 如何在UTF8中编译LaTeX?(How can I compile LaTeX in UTF8? [closed])
  • Rspec:“array.should == another_array”,但不用担心订单(Rspec: “array.should == another_array” but without concern for order)
  • Logcat错误:无法在android片段中加载视图(Logcat error: unable to load view in android fragments)
  • JavaFX的。(JavaFX. Adding items to the list in different threads is not working)
  • 从GDATA日历资源迁移到Google Calendar Resource api(Migrate from GDATA calendar resource to Google Calendar Resource api)
  • SSRS 2008 - 以零情景处理分割(SSRS 2008 - Dealing with division by zero scenarios)
  • 我如何以编程方式添加一个listView列标题的点击事件(How can I add a listView column header a click event programmatically)
  • Wxpython:无法检索有关列表控件项XXX的信息(Wxpython: Couldn't retrieve information about list control item XXX)
  • 使用Tortoise SVN在SVN存储库中移动目录(Move Directory across SVN repository using Tortoise SVN)
  • 天蓝色服务结构集群中的web api无状态服务是否在一段时间不活动后进入休眠状态?(Do web api stateless services in azure service fabric cluster go to sleep after a period of inactivity?)
  • 我可以设置intelliJ来突出显示PHP编码风格吗?(Can I set intelliJ to highlight php coding style?)
  • 用javafx创建一个Truetype字体文件(Creating a Truetype Font file with javafx)
  • Spring ftp配置错误(Spring ftp configuration is wrong)
  • 使用gsub去除多个字符(Using gsub to strip multiple characters)
  • 续订推送证书并保持当前的App Store App正常工作(Renew Push certificate and keep current App Store App working)
  • js:ES5和ES6之间关于'this'关键字用法的一个令人困惑的观点(js: one confusing point about 'this' keyword usage between ES5 and ES6)
  • window.onload vs $(document).ready()(window.onload vs $(document).ready())
  • 在Swift中,如何声明一个符合一个或多个协议的特定类型的变量?(In Swift, how can I declare a variable of a specific type that conforms to one or more protocols?)