u8glib中文显示

花费了一天的力气,终于把在m2tklib上显示汉字的坑填上了。

其中,只有一次想放弃,比以前的数次放弃有了很大进步。


根据MakerLab创客实验室文章,可以显示中文,但是按照他的说法,将末尾的一位删掉,尽管可以持续显示后面的汉字,但实际上字会缺一小部分,而他的完整例子中的字体好像又没问题。


使用bdf2u8g生成一个汉字:

const u8g_fntpgm_uint8_t c11[47] U8G_SECTION(".progmem.c11") = {
  0,13,13,255,254,0,0,0,0,0,136,136,0,11,255,0,
  0,11,12,24,12,0,255,0,128,68,160,34,192,128,128,87,
  224,20,32,39,224,36,32,199,224,68,32,68,32,68,224};


其数据格式,在u8g_font.c中有描述,如下:

/*
  ... instead the fields of the font data structure are accessed directly by offset 
  font information 
  offset
  0             font format
  1             FONTBOUNDINGBOX width           unsigned
  2             FONTBOUNDINGBOX height          unsigned
  3             FONTBOUNDINGBOX x-offset         signed
  4             FONTBOUNDINGBOX y-offset        signed
  5             capital A height                                unsigned
  6             start 'A'
  8             start 'a'
  10            encoding start
  11            encoding end
  12            descent 'g'                     negative: below baseline
  13            font max ascent
  14            font min decent             negative: below baseline 
  15            font xascent
  16            font xdecent             negative: below baseline 
  
*/


这里面说明字体通用描述是17个字节。

对照生成的数据,可以得到每个字节的对应解释。


0 - format 0

13 - 字体外框宽度

13 - 字体外框高度

255 - 字体外框 x偏移 -1

254 - 字体外框 y偏移 254

...

实际上,生成字体数据的第2行,首位置的0是 第17字节数据: 字体x下降;若删掉每行的末尾数字,则 0 变成每个字的末尾像素,显示就为缺角。


第2行数据,0,11,12,24,12,0,255,0,128,68,160,34,192,128,128,87 是对字进行描述。

/*
format 0
    glyph information 
    offset
    0             BBX width                                       unsigned
    1             BBX height                                      unsigned
    2             data size                                       unsigned    (BBX width + 7)/8 * BBX height
    3             DWIDTH                                          signed
    4             BBX xoffset                                    signed
    5             BBX yoffset                                    signed
*/


很好的看到,11是字宽, 12是字高, 24是字数据的尺寸,通过 (11+7)/8×12 ≈24, 后面的数据长度与此相符。因为数是除不尽的,所以末尾224,0xe0是高字节用来表示像素。


这次遇到的问题不算太难,被一行16个数据的表现形式迷惑。当然,主要原因还是对数据组织结构不了解,不知道每行的意义。 了解以后,自然很轻松的找到解决办法。


这样,前述文章中的代码要修改为第2个字时,删掉第1位数,这里通常是0, 而后在末尾加 ',‘,免除手添之麻烦。

'

				del c[0]  # 删掉第1行
				if not first_word:
					pos_first = c[0].index(',') 
					c[0] = c[0][pos_first+1:]  # 删掉第1个零,字体结构的第17字节
				if first_word:
					first_word = False
				c[1] = c[1] + ','  # 补充末尾逗号
				# result[w] = c
		
				# 写出到文件

汉字显示效果,结尾的像素是完整的,而且可以连续显示:


这里是使用了firefly-sung的字体,提取尺寸12的汉字,存到bdf。(在此致谢提供fontforge使用教程的作者)

u8glib+m2tklib的文章很少,再次感射makerlab实验室,他的文章做了细致的描述,同时 还要感谢麦知club的Yang给予的Python方面支持。


总之,谢谢大家的分享,“三人行必有我师;择其善者而从之,其不善者而改之。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

容沁风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值