LittlevGL中使用FreeType问题

博客主要讲述了在LittlevGL中使用FreeType时遇到的两个问题。一是字体出现噪点,原因是FreeType返回的字体位图高度不一致,解决方法是对位图进行0填充;二是字母排版问题,因东西方文字特点不同,需根据官方图重新排版,给出了获取起始位置的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LittlevGL中使用FreeType问题

问题一:噪点

直接使用FreeType返回的位图,当lvgl调用的时候回产生如下情况,字体下面会有很多的噪点:
在这里插入图片描述
原因:因为FreeType返回的字体位图高度不一致,而lvgl处理的时候是按照一定的字体高度进行处理,所以造成混乱,输入很多的噪点。

解决方法:对位图进行处理,高度不够的字体进行0填充,使它的高度与lvgl定义的高度一致,然后使用这个位图。代码如下:

memset(lv_bitmap, 0,  H_PX * bitmap->width); // H_PX为lvgl字体高度,像素为单位
memcpy(&lv_bitmap[copy_pos * bitmap->width], bitmap->buffer, bitmap->rows*bitmap->width);

问题二:字母排版

生成的bitmap正好就是文字的大小,所以把bitmap拷贝到大图像上以后必须对其进行排版。文字不能都直接拷贝入同样大小的方形子图像上,虽然对于东亚文字问题不大,但是对于西方文字会非常的难看。因为东亚文字不存在基线,字符的大小也相同;而西方的文字存在基线,文字需要对齐,字符的大小也不相同。
在这里插入图片描述
字体排版不是很好看,需要重新进行排版。

官方给出了一个图,根据这个图来进行排版:
在这里插入图片描述
获取字体的基线(origin),在更大的位图中也需要找出一个基线(lvgl位图),两个基线对应,基线的上半部分位图是存放字体的上半部分,他的高度为bearingY,lvgl的基线减去(bearingY+1),即可得到字体在更大图中的起始位置:完整代码如下

uint8_t lv_origin = (uint8_t)(H_PX * 0.85);
uint8_t copy_pos = lv_origin - slot->metrics.horiBearingY/64 - 1;

copy_bitmap(&slot->bitmap,copy_pos);
void copy_bitmap(FT_Bitmap*  bitmap,uint8_t copy_pos)
{
    int h_count = H_PX - bitmap->rows;
    memset(lv_bitmap, 0,  H_PX * bitmap->width);
    memcpy(&lv_bitmap[copy_pos * bitmap->width], bitmap->buffer, bitmap->rows*bitmap->width);
}

最后效果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值