本文主要介绍如何把 SVG 格式转成 TTF 文件,当然也可以生成其他格式的字体,如 WOFF、WOFF2 等。
SVG 中记录了各种路径信息,对于少量的 SVG 可以直接引用 SVG 文件,但是当有成千上万个 SVG 文件时,就可以直接转成 TTF 等格式的字体文件,统一了风格,压缩了大小。
SVG 文件转字体格式文件
SVG 字体的基本格式
使用工具把KaiTi_GB2312
字体转为svg格式,格式为:
1 |
|
<svg>
:SVG 字体的根元素,用于包裹整个字体定义。<metadata>
: 定义了字体的描述信息和元数据,如作者、版本、版权信息、制作日期、许可证等其他说明信息。<defs>
: 定义可可重复使用的的元素和属性。<font>
:定义 SVG 字体的容器。<font-face>
:定义字体的各种属性,如字体名称、字体文件路径等。<glyph>
:定义字体中的每个字符或图标,包括其路径和一些属性。<missing-glyph>
:定义当文本中使用的字符不在字体中时的替代显示内容。<path>
: 定义了字符的路径信息。
这些标签共同构成了 SVG 字体的定义和使用规范。
SVG 字体文件整合
现有一批SVG文件,每个文件中定义里一个或多个描述路径的信息。需要把这些SVG文件批量合成一个SVG字体文件。
SVG定义了多个<path>
路径,甚至有些SVG文件还会包含多个<g>
标签,==在字体文件中,不允许出现<g>
标签,且最多只允许出现一个<path>
标签,==。
单个SVG文件举例:
SVG格式如下:
1 | <svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="600px" height="850px"> |
需要做的工作有:
修改
<svg>
为<glyph>
标签,并增加glyph-name
和unicode
属性忽略
<g>
标签合并
<path>
标签
unicode
属性值是自定义的码位,已经在文件中定义好了,通过读取文件的方式给每个<glyph>
写上属性即可。
现有svg文件主要是汉字的笔顺图,path 信息已经有了,需要依次给每一笔添加一个码位信息。
码位对应信息如下:
id | 内码 | 汉字 | 笔顺 | 笔画数 | 笔顺起始DEC内码 | 笔顺起始HEX内码 | 笔顺结束DEC内码 | 笔顺结束HEX内码 |
---|---|---|---|---|---|---|---|---|
84 | U+4E10 | 丐 | 1215 | 4 | 983077 | F0025 | 983080 | F0028 |
… | … | … | … | … | … | … | … | … |
java 处理代码如下:
1 | public class Svg2Font { |
1 |
|
经过java
处理后得到了一个SVG 字体文件。
SVG 转 TTF
通过在线工具svg-to-ttf,可以把svg 转 ttf,即使是10M甚至更大的文件也可以轻易转换。等待一会就得到了一个ttf字体。
字体微调
为什么要微调?
在网页上查看一下字符显示的效果,html代码:(“我想要起飞”是默认字体显示,“󰀥 󰀦 󰀧 󰀨
”是新字体)
1 |
|
正常字符和字体中字符的显示对比:
虽然已经生成了字体文件,但是实际显示的时候还是有问题。这里我们主要解决2个问题:
- 字符宽度太宽
- 字符显示过小
如何微调?
使用字体工具 FontCreator
打开新生成的字体,通过脚本微调,参数有:
Scale
:基于基准“轴线中心”,水平百分比 400, 垂直百分比 400
Width
:减少 右侧 2250Width
:减少 左侧 650Move
: 水平 0, 垂直 -20
调整 Scale
解决了字形大小的问题,Width
解决了宽度过大的问题,Move
解决了基线略低的问题。参数值需要根据情况调整。
经过调整后,看下效果:
基本已经达到效果了。