arduino-esp32:LVGL中文字库(通用)_lvgl 中文字库_扶我起来我还有头发的博客-程序员宝宝

技术标签: ESP32开发  LVGL  嵌入式  单片机  

概述

(标题是arduino-esp32只是因为平台是这个)
LVGL默认的字库是英文的,当然其字库文件里也有一个带有中文的字库 lv_font_simsun_16_cjk ,不过里面的中文字并不多而且很多是繁体。这篇说一下怎么自己制作一个中文的字库并使用到LVGL中。

系统自带中文字库

在目录 lvgl/src/font 下,存放着官方自带的所有字库文件。其中 lv_font_simsun_16_cjk.c 就是自带的中文字库了。
在这里插入图片描述
在这个文件的头部列举出了一部分的文字,其实就是一部分的CJK编码的文字。包括中文、日文、韩文中的一部分的文字。
不过也只有很少一部分的汉字在这里面,而且有很多都是以繁体的形式给出的。
在这里插入图片描述
如果需要使用到的文字刚好这里面都有的话,那么可以直接使用这个字库就行了,不需要自己制作。
要使用这个字库也很简单。
首先在配置文件 lv_conf.h 中,找到这一段。系统默认是只选择使用了14px的 Montserrat 字体。
在这里插入图片描述
默认的字体也是这个。
在这里插入图片描述

只需要把这个 lv_font_simsun_16_cjk 字库的宏修改为1就可以了。
在这里插入图片描述
当然如果使用VS模拟器的话这些字库是全开的,在真正的开发板上是肯定做不到全开,内存肯定不够。

使用自带中文字库

首先在主文件里将 lv_demo_widghts.c 示例给注释掉。
在这里插入图片描述
打开下面的 lv_example_label_1() 示例。
在这里插入图片描述
这个例子会生成几个 label 组件的例子,更方便查看效果。
在这里插入图片描述
我们在不对字体做任何修改的情况下,按住ctrl点击这个函数,进入原代码中,在这里添加一行中文。
在这里插入图片描述
点击运行后,发现是不会显示的。
在这里插入图片描述
而且控制台也在不停的报错。找不到这些中文的编码。
在这里插入图片描述
尝试在这里添加这行代码lv_obj_set_style_text_font(label2, &lv_font_simsun_16_cjk, 0);
这条语句会将指定的组件的默认字体样式由 LV_FONT_MONTSERRAT_14 修改为 LV_FONT_SIMSUN_16_CJK
在这里插入图片描述
接下来再试试编译运行,可以发现只显示了一部分的汉字。 这个字并没有显示出来。
在这里插入图片描述
当然原因就是 这个字在字库里没有。
在这里插入图片描述

制作专属字库

首先打开LVGL官网lvgl.io,打开工具栏的 font converter
在这里插入图片描述
这是一个LVGL官方提供的将字库转化为LVGL专属的 C 文件的网站。
使用总顺序步骤如下图。
在这里插入图片描述
步骤如下:

  1. 文件名。首先需要给最后生成出来的字体文件取个名字,例如 my_font16.c ,这里就输入 my_font16
    在这里插入图片描述
  2. 字体大小。字库中每个字的像素大小。汉字由于较为复杂,太小了可能会变成一坨,啥也看不出,所以这里最好是稍微大一点。我一般用 16px。这个其实也就是源码中的字体文件后面的数字,代表着字体大小。
    在这里插入图片描述
  3. Bpp。bit per pixel,即每个像素所占的bit数。直接选4就行。
    在这里插入图片描述
  4. 选择字库源文件。点击选择文件后会打开文件系统,需要自行选择一个 ttf 格式或 woff 格式的字库。这个东西可以自己去百度搜,关键字例如 中文字库 ttf,就行。随便下载一个中文的ttf字库就可以。下载到本地之后上传到这里就行。最后的转换结果就是使用这个上传的字库里的字体。
    在这里插入图片描述
  5. Range。字符范围。看起来很奇怪,其实就是 Unicode 的范围。

统一码(Unicode),也叫万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

至于这个怎么选择,翻到这个网页下方,贴心的提供了一些参考网站。
在这里插入图片描述
第一个网站可以看到 Unicode 中每个16进制所代表的字符。我们一般最常用就是 0x20-0x7F 这个范围里的字符了,包括了数字、常用符号和所有大小写英文字符。
在这里插入图片描述
第二个网站提供了一个最直观的范围对应,如果你知道自己需要哪个标准字库,可以直接在这里找到范围。
在这里插入图片描述
回到配置项,我们可以根据需要来填写范围,抑或是单个字符,都可以填上去,中间以英文逗号分隔。
这里0x20-0x7F就是前文说的基础字符。
在这里插入图片描述

  • Symbols。具体的符号。如果说上方的 Range 提供的是一个大范围的字符选择,这里提供就是一些零散的精准字符选择。在这里你可以输入任何 Unicode 可编码的字符,如果你不嫌麻烦也可以将上面的 0x20-0x7F 代表的字符都在这一个一个输入进去,结果是一样的。
    在这里插入图片描述
  • 点击转换按钮即可。
    在这里插入图片描述
    点击之后,浏览器就会将网站自动生成的 C 文件下载到本地了。
    在这里插入图片描述
    这个文件就是我们自己的字库了。打开就可以看到我们在网站上输入的 RangeSymbols 里的字符了。

使用专属字库

首先把浏览器下载的 C 文件放进 lvgl/src/font 路径下。
在这里插入图片描述

VS模拟器

在资源管理器中的 lvgl/src/font 路径下右键添加现有项,选择刚才放进来的字库文件。
在这里插入图片描述
lv_conf.h 中,添加自定义的字体库。myfont_16 就是文件名。
在这里插入图片描述
重新生成解决方案。
在这里插入图片描述
回到最开始的例子里,修改下图中参数为这个字体。
在这里插入图片描述

效果

再次运行,可以发现我们配置的 label 中的字体已经变成刚才使用中文字库生成的字体了。 字也出现了。
在这里插入图片描述

arduino-esp32

基本流程都是一样的。不过需要修改一下包含路径。

  • myfont_16.c 文件放进 lvgl-master/src/font 文件夹中。
  • 修改 myfont_16.c 的路径信息。将#include lvgl/lvgl.h修改为#include ../../lvgl.h
    在这里插入图片描述
  • lv_conf.h 中配置自定义字体库LV_FONT_DECLARE(myfont_16)

效果

这是我自己正在用的界面,16px在屏幕上效果还可以。
在这里插入图片描述

小结

官方的这个转换网站还是很方便的,如果有新添加的字符或是文字,随时可以再次添加,然后生成一个新的文件替换掉之前的文件即可。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/unclejin_/article/details/124122173

智能推荐

支持向量机-wine数据集_G_瑞琴的博客-程序员宝宝_wine数据集

支持向量机是监督式学习算法,主要应用于分类,它的目的是寻找一个超平面对样本进行分割,分割的原则是间隔最大化。(1)当训练数据线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;(2)当训练数据近似线性可分时,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;(3)当训练数据线性不可分时,通过核技巧(将低维数据映射到高维空间的办法)或软间隔最大化,学习一个线性分类器,即非线性支持向量机。使用支持向量机对wine数据集进行分类1、导入数据集(加载scikit-lea

java正则 链接_Java使用正则表达式匹配获取链接地址的方法示例_贺叔的博客-程序员宝宝

本文实例讲述了Java使用正则表达式匹配获取链接地址的方法。分享给大家供大家参考,具体如下:获取页面中字符串的url地址我们都会使用正则表达式来匹配获取了,下面我来给大家总结几个匹配获取链接地址示例。1、正则表达式中Matcher中find()方法的应用。2、String对象中的 replaceAll(String regex,String replacement) 方法的使用。通过这个方法去除了...

用PIL读取保存图片错误 :OSError: cannot write mode RGBA as JPEG_点亮~黑夜的博客-程序员宝宝

用PIL读取保存图片错误 :OSError: cannot write mode RGBA as JPEG(20190213)文章目录:一、错误原因分析二、解决方式1、把PNG格式转换成的四通道转成RGB的三通道2、保存PNG格式用PLI模块,把PNG格式图片处理之后,想保存成JPG格式结果出错啦,下面是遇到的问题和解决方式,一起去看看吧!!!一、错误原因分析image.save('gi...

超全的面试知识点总结(研发体系知识点)_玄明Hanko的博客-程序员宝宝

一、基础1.1 操作系统1.1.1 基本知识略1.1.2 常见Linux命令目录文件内容搜索系统类网络cdcp/scpvi/vimfind:   find . -name xxkillnetstat -anotlsmvcatgrep:   ps -efgrep xxlsof:   lsof-i:portmkdirrmtailwhereistoppwdta.

浅谈DHCP option60,单臂路由,DHCP-sever的适用_GAGABOOM的博客-程序员宝宝_option60

新人新帖。本文是一个客户和我讨论DCHP option60的功能时而衍生的一些功能,仅作为一个笔记打发时间,废话不多直接入题。DHCP 是RFC2131定义,DHCP 2132定义了dhcp option .9.13. Vendor class identifierThis option is used by DHCP clients to optionally identify the v...

linux下挂载(mount)光盘镜像文件、移动硬盘、U盘、Windows和NFS网络共享_a746742897的博客-程序员宝宝_linux smb共享u盘

linux下挂载(mount)光盘镜像文件、移动硬盘、U盘、Windows和NFS网络共享分类: Linux如何在linux系统下挂接(mount)光盘镜像文件、移动硬盘、U盘以及Windows网络共享和UNIX NFS网络共享。挂接命令(mount)命令格式:mount [-t vfstype] [-o options] device dir其中:1.

随便推点

FJUT3703 这还是一道数论题(二分 + hash + manacher 或者 STL + hash 或者 后缀数组 + hash)题解..._weixin_30778805的博客-程序员宝宝

Problem Description最后来个字符串签个到吧,这题其实并不难,所需的算法比较基础,甚至你们最近还上过课。为了降低难度,免得所有人爆零。这里给几个提示的关键字 :字符串,回文,二分,哈希. 注意要对奇偶回文分开二分这样还不会做,说明基础有所欠缺。给你一个字符串A和一个字符串B,请你求一个满足以下要求的所有字符串中,最长的字符串C的长度:C...

数据库SQL习题练习Day1_释槐鸟~的博客-程序员宝宝

牛客网上原题题练习,并进行习题解析

将SSH服务加入系统服务中开机自动开启_米玖的博客-程序员宝宝

要想通过ssh远程访问,需要手动执行 service sshd start,这样sshd服务才开启。 通过chkconfig可以将sshd加入到系统服务中。   [[email protected] ~]# chkconfig sshd on      可以再查看sshd的运行级别状态:   [[email protected] ~]# chkconfig --list

DELPHI 使用 HmacSha1_九木Delphi的博客-程序员宝宝_delphi hmac-sha1

uses   System.Hashprocedure TForm1.btn1Click(Sender: TObject);var  data, key: string;begin  data := 'XXXXX';  key := 'key';  mmo1.Text:=THashSHA1.Create.GetHMAC(data, key);end;

ListView(headerView,footerView)_GoKu~的博客-程序员宝宝_listview.view

ListView 用来显示一个条目列表,条目对应的数据来自于 Model,而每个条目的外观则由Delegate 决定。我们可以将Delegate 看成如何展示 Item 的一个模板。Android手机上常见的联系人界面,其实就是使用 ListView 实现的,而且 Android 的 ListView 和 Qt Quick 的ListView 使用同样的模式:Model、View、Item Template(Delegate)。要使用 ListView,必须为其指定一个Model、一个Delega.

An-interesting-scholar-search-engine:gycc.com_拔剑-浆糊的传说_新浪博客_普通网友的博客-程序员宝宝

http://www.gycc.com/ is an interesting scholar search engine.If you try to search some paper by someone, it may failed. But ifyou try to search something in some field, you could get a lot ofin...