雨滴科技技术论坛

 找回密码
 立即注册
查看: 2273|回复: 6

LittlevGL中使用FreeType问题

  [复制链接]

68

主题

274

帖子

2306

积分

金牌会员

Rank: 6Rank: 6

积分
2306
扫一扫,手机访问本帖
发表于 2019-5-22 20:59:21 | 显示全部楼层 |阅读模式
问题一:噪点
直接使用FreeType返回的位图,当lvgl调用的时候回产生如下情况,字体下面会有很多的噪点:
                      1558527127273.png
原因:因为FreeType返回的字体位图高度不一致,而lvgl处理的时候是按照一定的字体高度进行处理,所以造成混乱,输入很多的噪点。
解决方法:对位图进行处理,高度不够的字体进行0填充,使它的高度与lvgl定义的高度一致,然后使用这个位图。代码如下:
  1. memset(lv_bitmap, 0,  H_PX * bitmap->width); // H_PX为lvgl字体高度,像素为单位
  2. memcpy(&lv_bitmap[copy_pos * bitmap->width], bitmap->buffer, bitmap->rows*bitmap->width);
复制代码
问题二:字母排版
生成的bitmap正好就是文字的大小,所以把bitmap拷贝到大图像上以后必须对其进行排版。文字不能都直接拷贝入同样大小的方形子图像上,虽然对于东亚文字问题不大,但是对于西方文字会非常的难看。因为东亚文字不存在基线,字符的大小也相同;而西方的文字存在基线,文字需要对齐,字符的大小也不相同。没有进行排版前:
                                     1558528293641.png
字体排版不是很好看,需要重新进行排版。
官方给出了一个图,根据这个图来进行排版:
                                 1558528409308.png
获取字体的基线(origin),在更大的位图中也需要找出一个基线(lvgl位图),两个基线对应,基线的上半部分位图是存放字体的上半部分,他的高度为bearingY,lvgl的基线减去(bearingY+1),即可得到字体在更大图中的起始位置:完整代码如下
  1. uint8_t lv_origin = (uint8_t)(H_PX * 0.85);
  2. uint8_t copy_pos = lv_origin - slot->metrics.horiBearingY/64 - 1;

  3. copy_bitmap(&slot->bitmap,copy_pos);
复制代码
  1. void copy_bitmap(FT_Bitmap*  bitmap,uint8_t copy_pos)
  2. {
  3.     int h_count = H_PX - bitmap->rows;
  4.     memset(lv_bitmap, 0,  H_PX * bitmap->width);
  5.     memcpy(&lv_bitmap[copy_pos * bitmap->width], bitmap->buffer, bitmap->rows*bitmap->width);
  6. }
复制代码
最后效果:
                         1558529287573.png


回复

使用道具 举报

282

主题

1583

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17105
发表于 2019-5-23 10:53:27 | 显示全部楼层
很好
回复

使用道具 举报

513

主题

1974

帖子

8158

积分

论坛元老

Rank: 8Rank: 8

积分
8158
发表于 2019-5-24 14:23:26 | 显示全部楼层
效果不错,文章不错。
回复 支持 反对

使用道具 举报

316

主题

1742

帖子

6041

积分

论坛元老

Rank: 8Rank: 8

积分
6041
发表于 2019-5-25 10:56:13 | 显示全部楼层
很好,厉害!
系列作品:
财税知识 – 索引
矛盾综合体(关于孩子教育)
我们家的王老师(关于孔明锁、魔方、魔方机器人)
科普 - 索引
美国见闻
回复

使用道具 举报

0

主题

1

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2019-5-31 20:15:35 | 显示全部楼层
你好,lv_bitmap的大小设置了多少,我按照你的方式,字符多会死机
回复 支持 反对

使用道具 举报

68

主题

274

帖子

2306

积分

金牌会员

Rank: 6Rank: 6

积分
2306
 楼主| 发表于 2019-6-2 17:39:34 | 显示全部楼层
atmfjg 发表于 2019-5-31 20:15
你好,lv_bitmap的大小设置了多少,我按照你的方式,字符多会死机

lv_bitmap可以根据字体大小设置的,我设置最大不超过100*100
回复 支持 反对

使用道具 举报

404

主题

2039

帖子

1万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
10717
发表于 2019-6-2 19:46:04 | 显示全部楼层
今后考虑用串口屏技术做图像识别,实现精准控制,移植OpenMV进去。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
在线咨询
咨询热线
0755-26787502-8006/8016
扫一扫二维码
直接访问本站

QQ|Archiver|手机版|小黑屋|雨滴科技  

GMT+8, 2021-10-16 10:06 , Processed in 0.069027 second(s), 13 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表