在ESP32的Lvgl8上使用LvglFontTool显示汉字

2023-10-30

一、使用LvglFontTool4.0转换字体

这个工具是阿里兄大佬提供的,他的论坛下载地址
不过由于lvgl8的字体结构体变了一下,最新4.0转换出内部字体的话,需要对生成的c文修改一下才能用
在这里插入图片描述
输入要用到的字,或者直接选加入常用汉字,就看flash够不够大了。
然后选择字体。由于我win10权限的关系,我windows目录里面看不到Font文件夹,需要到控制面板——字体打开Font文件夹,然后将需要的字体文件拷贝到其他地方,才能选择字体
在这里插入图片描述
最后点开始转换,就能生成c文件,存到电脑本地目录

二、修改生成的C文件

因为lvgl8的lv_font_fmt_txt_dsc_t结构体将原来的last_letter和last_glyph_id放到了新的成员cache里面了,所以需要对应改过来

/*Describe store additional data for fonts*/
typedef struct {
    /*The bitmaps of all glyphs*/
    const uint8_t * glyph_bitmap;
    /*Describe the glyphs*/
    const lv_font_fmt_txt_glyph_dsc_t * glyph_dsc;
    /*Map the glyphs to Unicode characters.
     *Array of `lv_font_cmap_fmt_txt_t` variables*/
    const lv_font_fmt_txt_cmap_t * cmaps;
    /**
     * Store kerning values.
     * Can be  `lv_font_fmt_txt_kern_pair_t *  or `lv_font_kern_classes_fmt_txt_t *`
     * depending on `kern_classes`
     */
    const void * kern_dsc;
    /*Scale kern values in 12.4 format*/
    uint16_t kern_scale;
    /*Number of cmap tables*/
    uint16_t cmap_num       : 9;
    /*Bit per pixel: 1, 2, 3, 4, 8*/
    uint16_t bpp            : 4;
    /*Type of `kern_dsc`*/
    uint16_t kern_classes   : 1;
    /*
     * storage format of the bitmap
     * from `lv_font_fmt_txt_bitmap_format_t`
     */
    uint16_t bitmap_format  : 2;
    /*Cache the last letter and is glyph id*/
    lv_font_fmt_txt_glyph_cache_t * cache;
} lv_font_fmt_txt_dsc_t;

新建一个lv_font_fmt_txt_glyph_cache_t

static lv_font_fmt_txt_glyph_cache_t glyph_cache = {
    .last_letter = 0x6c14,
    .last_glyph_id = 98,
};

将原来的font_dsc里面的last_letter和last_glyph_id删掉,放上新的cache

static lv_font_fmt_txt_dsc_t font_dsc = {
    .glyph_bitmap = glyph_bitmap,
    .glyph_dsc = glyph_dsc,
    .cmaps = cmaps,
    .cmap_num = 1,
    .bpp = 4,

    .kern_scale = 0,
    .kern_dsc = NULL,
    .kern_classes = 0,

    .cache = &glyph_cache
};

最后将下面所有的fdsc结构体的引用改为fdsc->cache->last_letter和fdsc->cache->last_glyph_id,这样编译就不会报错了

 if (unicode_letter == fdsc->cache->last_letter)
    {
        i = fdsc->cache->last_glyph_id;
    }
    else
    {

二、使用字体

用法1:在canvas上绘制

LV_FONT_DECLARE(myFont) //声明自定义字体

void test_canvas_font(void)
{
   //创建画布
   static lv_color_t cbuf[LV_CANVAS_BUF_SIZE_TRUE_COLOR_ALPHA(128, 160)];
   static lv_obj_t *canvas;
   canvas = lv_canvas_create(lv_scr_act());
   lv_canvas_set_buffer(canvas, cbuf, 128, 160, LV_IMG_CF_TRUE_COLOR_ALPHA);
   lv_obj_set_align(canvas, LV_ALIGN_CENTER);
   // 绘制中文字体
   lv_draw_label_dsc_t label_dsc;
   lv_draw_label_dsc_init(&label_dsc);
   label_dsc.color = lv_palette_main(LV_PALETTE_RED);
   label_dsc.font = &myFont;	//设置自定义字体
   lv_canvas_draw_text(canvas, 0, 0, 160, &label_dsc, "天气:晴(Happy!)");
}

效果
在这里插入图片描述

用法2:在label上显示

LV_FONT_DECLARE(myFont) //声明自定义字体

void test_label_font(void)
{
   // 创建字体样式
   static lv_style_t style_font;
   lv_style_init(&style_font);
   lv_style_set_text_font(&style_font,  &myFont);  //样式使用自定义字体
   lv_style_set_text_color(&style_font, lv_palette_main(LV_PALETTE_LIGHT_GREEN));   //设置字体颜色
   //创建标签
   lv_obj_t *label = lv_label_create(lv_scr_act());
   lv_label_set_text(label, "天气:晴(label)");  //设置标签文字
   lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, 0);
   lv_obj_add_style(label, &style_font, LV_STATE_DEFAULT);  //应用字体样式到标签
   lv_obj_align(label, LV_ALIGN_BOTTOM_MID, 0, -20);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在ESP32的Lvgl8上使用LvglFontTool显示汉字 的相关文章

  • python版本onnx模型多输入

    onnx模型有两个输出的情况 import onnxruntime def use onnx model model path session onnxruntime InferenceSession model path enable c

随机推荐

  • node+express 获取微信小程序的session_key和openid

    前言 使用node来写一个服务接口 接收前段的code 然后返回微信小程序的session key和openid 注意 小程序的appId必须是企业认证的 个人认证的无法通过 wx login 会报错 步骤 1 安装插件 request c
  • 下列软件包有未满足的依赖关系: python-catkin-pkg : 依赖: python-catkin-pkg-modules (>= 0.5.2) 但是它将不会被安装

    您也许需要运行 apt fix broken install 来修正上面的错误 下列软件包有未满足的依赖关系 python catkin pkg 依赖 python catkin pkg modules gt 0 5 2 但是它将不会被安装
  • 软件测评中心测试项目及测试过程简析,CMA、CNAS软件测试报告获取

    软件测试是产品周期中必不可少的一步 可以更好的保障软件质量 那么我们所知的软件测评中心一般有哪些测试项目以及测试流程是如何 和小编一起往下看看吧 一 软件测评中心的测试项目 1 功能测试 通过模拟用户使用场景 测试软件的各项功能是否正常 稳
  • 带你轻松理解python类的一些基础用法(❁´◡`❁)

    总结一下前一段时间的学习成果 将我对知识点的简易理解方法分享给大家 大家可以参考着学习 希望对你们学习python有帮助 使用继承开发程序 用子类继承父类 首先我们先创建一个父类 大家可以将我们的这个父类理解为 就是外面最大的一个类 他的里
  • How YouPorn Uses Redis: SFW Edition

    I interviewed Eric Pickup IT Lead at the Manwin group the company behind sites like YouPorn and Pornhub to tell us about
  • element-ui 点击dialog右上角关闭图标不关闭的问题

    网上一些人说不起效是因为 visible 属性没有添加 sync 修饰符 一般情况下是因为一个 before close 属性 这个是关闭前的回调 会暂停dialog的关闭 该回调接收一个 done 函数作为参数 必须在回调里执行 done
  • ue先视频教程后深入

    入职后 发现让我搞cesium for unreal 其他人不会 幸亏我以前跌跌撞撞地运行过 第二遍进行起来就熟能生巧了 然后进行了和mysql的结合 我发现 还是先搞视频教程 再深入 有先有后 学了不会白学 后深入的原因是 有的同事搞视频
  • 图片文本linux,Tesseract: 从图片提取文本

    经常遇到同事要求排查故障 但却提供截图而不出示文本信息 为此 我考虑用 OCR Optical Character Recognition 光学字符识别 技术从截图中将文本提取出来 通过试用和比较 我感觉 Tesseract 还不错 故在此
  • Games101,作业7(多线程提速)

    多线程 多线程的相关信息可根据我的另一个blog查看 多线程处理提速方式 将像素width height分隔为多份 每一份交给一个线程处理 分隔方式有 网格分隔 代码中使用了这种分隔方式 条形分隔 每一列 或 每一行 为一个线程 更利于编程
  • 基于Java的航空售票管理系统

    源码下载 http www byamd xyz hui zong 1 摘 要 本课题设计的是航空购票管理系统 本系统主要设计了三个类 分别是Infor类 gongneng类和测试 Test 类 在Infor类里面主要定义了数组 分别是nam
  • 【解决】Python——Max retries exceeded with url: (Caused by NewConnectionError(‘<urllib3.connection

    HTTPConnectionPool host yzw zjnu edu cn port 80 Max retries exceeded with url Caused by NewConnectionError
  • C++Primer Section 2-1

    Section 2 1 Primitive Built in Types Section 2 1 1 Arithmetic Types Differences in Integer Types Differences between cha
  • 如何读懂别人写的vc++代码

    每个人的编程习惯各异规范程度 命名规则 使用习惯也不尽相同 有人爱用Timer 有的人用线程 有的人用PostMessage有的人用SetEvent或回调或直接调用 所以别人的程序也是良莠不齐 所以要求你对编程基础 程序构架 业务规则都要有
  • 95-34-035-Context-HeadContext和TailContext

    文章目录 1 概述 2 继承体系 3 HeadContext 3 1 类签名 4 TailContext 1 概述 HeadContext和TailContext使用继承的方式关联Handler 作为ChannelPipeline双向链表的
  • Sort()函数用法:比较函数写法

    sort 函数 sort函数可以三个参数也可以两个参数 必须包含头文件 include lt algorithm gt using namespace std 它使用的排序方法是类似于快排的方法 时间复杂度为o nlog n Sort函数有
  • 微信开发 "errcode":-1 应该怎么办

    相信不少朋友在微信开发的时候遇到了 string errcode 1 errmsg system error length 38 这个时候并不是你的代码有问题 你只需要将你的PHP文件的编码改成utf 8即可 不知道如何操作的朋友 可以按照
  • Java 前后端分离业务封装 对后端返回值进行封装 PageVO封装

    遇到前后端业务需要不一致时对Controller返回结果进行封装 后端返回结果 前后端分离后 web 端要求结果 counts 2694 pagesize 14 pages 8 page 66 items id 9009384 title
  • qtcpsocket类read函数接收大数据_一篇易懂的CAN 通讯功能实现指南2--READ

    通过一篇易懂的CAN通讯协议指南1 我们知道 CAN总线的2种架构 高速CAN和低速CAN CAN协议帧类型 数据帧 遥控帧 错误帧 过载帧 线与机制 仲裁机制 位定时与同步 以上基础的应用多数体现在硬件处理部分 所以只有少数体现在软件部分
  • Vue-搜索框实现

    热爱生活 热爱技术 热于分享 一 方法分析 1 字符串匹配 BF算法 KMP算法 库函数indexOf均可实现 2 v for循环实时更新元素 3 click 实现点击后页面的跳转同时设置不同id来根据内容的不同来跳转到不同页面 二 代码分
  • 在ESP32的Lvgl8上使用LvglFontTool显示汉字

    这里写目录标题 一 使用LvglFontTool4 0转换字体 二 修改生成的C文件 二 使用字体 用法1 在canvas上绘制 用法2 在label上显示 一 使用LvglFontTool4 0转换字体 这个工具是阿里兄大佬提供的 他的论