【utf-8码简介】
要让智能设备支持各国不同的文字,首先得有支持全球文字的编码集,时下最出名的要数utf-8码了。它一种可变长度字符编码,使用1~4字节为每个字符编码,由此它可以用来表示unicode标准中的任何字符,而且仍与ascii码相兼容。
有了国际范的utf-8码,如果我们再有一个支持 utf-8码的字库 ,那显示各国的文字就很简单了。接下来就讲一下怎么制作一个支持utf-8码的字库(当然这个并不是包含所有的字符,而是只覆盖所需的就可以了)
【制作utf-8码字库】
要制作字库,肯定是要找一个现成的取模工具了(这种工具网上有很多),今天我们就使用arm-2d提供的一个python小工具来制作utf-8码的字库,下载最新的arm-2d,你就会看到在acceleration下有一个ttf2c.py文件,如下图
有了这个工具,我们就看看怎么使用它来制作字库文件。
【准备工作】
首先,你的电脑中要安装了python3,并且安装了下面两个软件包(freetype-py和numpy)
pip install freetype-py然后从网上或者电脑c:windowsfonts文件夹下找到一个后缀名为ttf的字体文件,如下
【制作字库】
接下来就用ttf2c.py制作字库,它的使用在官方文档中也有,如下
当然,你也可以用【-h】指令来查看它的使用方法,如下图
我们使用的指令为:python3 ttf2c.py -h【-i】为后缀ttf文件【-t】为txt文件,里面为我们要生成字库的所有字符【-n】为我们生成的字库起名字,可以不写(默认为arm_2d_font_utf8)【-o】就是输出的字库文件【-p】为字体大小(比如30个像素、50个像素)【-s】可以设置生成的字库为a1、a2、a4、a8,(默认会生成所有的类型)。其中 a1所占的flash空间是最小的 ,a2、a4、a8还支持字体透明度哦。好,那我们现在就用这个工具生成一个字库试试,首先新建一个txt文件,输入我们要生成字库的所有字符,如下
在cc.txt文件中输入的字符为“ 嵌入式小书虫 ”,待会就会生成对应的字库文件。
生成字库的指令如下
此时就会生成字库文件 qrsxsc.c ,如下图
有了字库文件,显示字符就很简单了。
【显示utf-8码的文字】
使用arm-2d来显示自定义字库中的文字也很简单,首先声明一下我们生成的字库,以a8为例,如下
extern struct {然后就可以使用这个字库啦,很简单,代码如下
arm_lcd_text_set_font(&arm_2d_font_utf8_a8);第1行就是设置我们的字库第2行为设置字符显示的区域,null为整个屏幕第3行为设置字体颜色第4行为设置在第几行第几列进行显示字符第5行为设置字体的透明度最后调用arm_lcd_printf函数就可以了注意: 此时,把程序下载进去,可能屏幕不会显示“ 嵌入式小书虫 ”这几个字哦!
这是因为我们的字库是utf-8编码的,而你在keil mdk中可能设置的是gb2312编码集哦,所以当屏幕没有显示出我们想要的字符时,要记得修改一下编码集,如下
点击小扳手进行设置,如下
好了,这样屏幕中就可以显示我们的字符了。
值得一说的是我们使用了arm-2d提供的arm_lcd_print_banner 函数,它可以方便我们 在指定的区域内居中显示字符串 ,如下图
程序如下
arm_2d_region_t myregions={第1个参数就是要显示的字符串第2个参数为字符串显示的区域第3个参数就是要使用的字体怎么样,使用还是很简单吧,o(∩_∩)o哈哈~
其实banner还有2个不同的版本(不同的参数)哦!
如果我们已经设置好了字体,第3个参数是可以省略的,如下
arm_lcd_print_banner(雷阵雨,myregions);如此,上面的代码也可以改写成这样,如下
arm_lcd_text_set_font((arm_2d_font_t*)&arm_2d_font_utf8_a8);同样的,第二个参数也可以省略,如下
arm_lcd_print_banner(雷阵雨);那这个只有一个参数,没有设置区域,它会在哪里居中呢?
此时如果只传一个参数,它就会 默认在屏幕中间显示字符串 。
是不是觉得banner这个函数就是专门为支持各国不同的文字量身定做的,使我们可以轻松实现多国语言的切换
当然,使用很简单,那是因为arm-2d都为我们制作好了,其实ttf字体里面还有很多bearing( 字体大小、水平预留值等 ),如下图
这些arm-2d都为我们做好了,感兴趣的可以看源码哈(* ̄︶ ̄),这里我们就不讲了。
不过还有一个关于字符显示的api函数需要简单介绍一下,就是提取一行字符串尺寸的函数,如下
arm_2d_size_t stringsize = arm_lcd_get_string_line_box(雷阵雨,&arm_2d_font_utf8_a8);arm_lcd_get_string_line_box这个函数可以帮我们计算出给定字体给定字符串的一行的尺寸,这样就可以精确控制字符串位置(方便进行对齐哦),在banner函数中就使用了此函数,它的妙用还期待大家进行开发( *  ̄︶ ̄)【温故知新】
对了,大家有没有发现,视频中的闪电由明变暗然后又变明(好像在呼吸),这个是怎么实现的呢?
其实这个还是用了上一篇文章讲过的知识,使用了arm_2d_helper_time_cos_slider,程序如下
uint8_t opacity = 0;在frame_start函数中调用,使iresult的取值按照cos函数变化,其取值范围为0~255,然后赋值给opacity,使闪电图片的透明度按照cos曲线变化最后在绘制函数中按照计算出来的透明度进行绘制就可以了,如下arm_2dp_rgb565_tile_copy_with_colour_keying_and_opacity(null,倒数第2个参数就是透明度哦
爱芯元智影像专用芯片AX170A成功进入消费领域,全面提升手机拍摄体验
神舟优雅X4全新升级 性价比之王,杠杠的!
小米mix2什么时候发布?小米mix2又新增一项黑科技:屏幕内嵌指纹技术
语音模块能给浴室暖气扇带来什么?
计算机控制系统关于工业方面设计过程
单片机也可以轻松玩转UTF-8码和TTF字体了
HarmonyOS 2.0一横一纵赋能全场景生态 未来一年冲击过亿目标
采用2.4GHz射频通信的多功能鼠标设计
三星研发自发光QLED显示技术 意图实现更长的使用寿命
华为正式发布鸿蒙手机操作系统
bms电池管理概述 bms电池管理什么意思
预测:全球IC设计厂商研发支出将大幅攀升
用线性数字电位器实现对数调节
车灯IC 带过温保护降压型恒流芯片 PT4115
网络时代下 我们该如何界定网络隐私的边界
如何利用无线技术提高采矿效率
森林防火远程监控解决方案,再隐秘的角落也难逃天眼
苹果正在要求供应商增加iPhone产能
路面铣刨机状态监测与运维管理系统
显示技术的变革之路在哪里