外部字体
# 简介
[LVGL API 字体](https://doc.openluat.com/wiki/21?wiki_page_id=2609 "LVGL API 字体")
这里我们用lv_font_conv生成外部字体
# 安装lv_font_conv
首先安装[nodejs(点击这里下载对应安装包)](https://nodejs.org/en/download/ "nodejs")这里不做介绍,下载安装即可
打开cmd运行
```lua
npm i lv_font_conv -g
```
即可安装好lv_font_conv
我们cmd运行lv_font_conv测试

显示如上内容,证明lv_font_conv 已正常运行
# lv_font_conv命令介绍
常用命令:
- `--bpp` - 每像素位数(抗锯齿)
- `--size` - 输出字体大小(像素)
- `-o`, `--output`- 输出路径(文件或目录,取决于格式)
- `--format` - 输出格式
- `--format dump` - 转储字形图像和字体信息,用于调试
- `--format bin`- 以二进制形式转储字体(如[规范中所述](https://github.com/lvgl/lv_font_conv/blob/master/doc/font_spec.md))
- `--format lvgl`- 以[LittlevGL](https://github.com/lvgl/lvgl)格式转储字体
- `--force-fast-kern-format`- 始终使用更快速的 kering 存储格式,但要付出一定的代价。如果出现尺寸差异,则会显示出来
- `--lcd` - 生成具有 3 倍水平分辨率的位图,用于子像素平滑
- `--lcd-v` - 生成具有 3 倍垂直分辨率的位图,用于子像素平滑
- `--use-color-info`- 尝试使用字体中的字形颜色信息来创建灰度图标。由于灰色色调是通过透明度模拟的,因此仅在对比背景上效果会很好
- `--lv-include`- 仅与`--format lvgl`,为 设置备用路径`lvgl.h`
字体命令:
- `--font`- 字体文件的路径(ttf/woff/woff2/otf)。可多次用于合并
- `-r`, `--range`- 单个字形或范围 + 可选映射,属于先前声明的`--font`. 可以多次使用。例子:
- `-r 0x1F450` - 单值、十进制或十六进制格式
- `-r 0x1F450-0x1F470` - 范围
- `-r '0x1F450=>0xF005'` - 带有映射的单个字形
- `-r '0x1F450-0x1F470=>0xF005'` - 带映射的范围
- `-r 0x1F450 -r 0x1F451-0x1F470` - 2个范围
- `-r 0x1F450,0x1F451-0x1F470`- 同上,但定义为 single `-r`
- `--symbols`- 要复制的字符列表(而不是 中的数字格式`-r`)
- `--symbols 0123456789.,` - 提取字符以显示数字
- `--autohint-off` - 不要强制自动提示(默认情况下“灯”是打开的)
- `--autohint-strong` - 使用更强大的自动提示(会破坏字距调整)
其他调试选项:
- `--no-compress` - 禁用内置 RLE 压缩
- `--no-prefilter` - 禁用位图线过滤器(XOR),用于提高压缩率
- `--no-kerning` - 删除字距调整信息以减小大小(不推荐)
- `--full-info` - 不要缩短“font_info.json”(包括像素数据)
我们输入以下命令即可生成我们想要的.bin外部字库了
```shell
lv_font_conv --no-compress --format bin --font D:\8910\lvgl\Font-OPPOSans\OPPOSans-B.ttf -o D:\8910\lvgl\myfontd\opposans_b_20.bin --bpp 4 --size 20 -r 0x30-0x39 -r 0x41-0x5A -r 0x61-0x7A
```
这里是通过OPPOSans-B.ttf 字库生成opposans_b_20.bin模块加载字库,由于空间有些这里只是生成了1-9数字A-Z大小写字母
# 字体使用
```lua
function makeButton(CONT)
local text="1234567890"
local label_18px = lvgl.label_create(CONT, nil)
lvgl.label_set_recolor(label_18px, true)
local font18 = lvgl.font_load("/lua/datefont.bin")
lvgl.obj_set_style_local_text_font(label_18px, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font18)
lvgl.label_set_text(label_18px, "#FFFFFF "..text)
lvgl.obj_align(label_18px,CONT, lvgl.ALIGN_IN_TOP_LEFT, 0,30)
local label_40px = lvgl.label_create(CONT, nil)
lvgl.label_set_recolor(label_40px, true)
local font = lvgl.font_load("/lua/timefont.bin")
lvgl.obj_set_style_local_text_font(label_40px, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font)
lvgl.label_set_text(label_40px, "#FFFFFF "..text)
lvgl.obj_align(label_40px,label_18px, lvgl.ALIGN_OUT_BOTTOM_LEFT, 0,50)
end
```
# 测试固件和脚本
[LuatOS-HMI_V3209_RDA8910.pac](https://cdn.openluat-luatcommunity.openluat.com/attachment/20220225182756918_LuatOS-HMI_V3209_RDA8910.pac)
[product/金牛座开发板/3.project/mediaAirController](https://gitee.com/openLuat/Luat_Lua_Air724U/tree/master/product/%E9%87%91%E7%89%9B%E5%BA%A7%E5%BC%80%E5%8F%91%E6%9D%BF/3.project/mediaAirController)
# 显示效果

## 参考文档
[LuatOS-SoC之LVGL字体篇](https://doc.openluat.com/article/3496# "LuatOS-SoC之LVGL字体篇")
# 常见问题
# 字库添加中文字符的方法
添加中文字符用的是Unicode码,比如要添加"中文"这个两个字符到字库,只需要在命令行指定这个字符的Unicode即可,以下命名是在上面命令的基础上添加"中文"2个字符的命令
```shell
lv_font_conv --no-compress --format bin --font D:\8910\lvgl\Font-OPPOSans\OPPOSans-B.ttf -o D:\8910\lvgl\myfontd\opposans_b_20.bin --bpp 4 --size 20 -r 0x30-0x39 -r 0x41-0x5A -r 0x61-0x7A -r 0x4E2D -r 0x6587
```
这里0x4E2D 是“中”的Unicode码,0x6587是“文”的Unicode码
# 权限不够报错问题
cmd 必须管理员权限,要生成的 *.bin文件和用到的*.ttf字库所在目录要有user用户写权限
例如:

出现如上错误,需要用管理员权限
要生成的 *.bin文件和用到的*.ttf字库所在目录权限如下:

如权限不够会报如下错误:
