技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 483|回复: 2
收起左侧

【VB6】用于单片机显示GB2312中文字符的字模生成器

[复制链接]

1041

主题

2328

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
217
威望
288 点
宅币
18063 个
贡献
36605 次
宅之契约
0 份
在线时间
1732 小时
注册时间
2014-1-26
发表于 2019-4-1 20:24:24 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
单片机显示中文一直以来都是一个比较令人头疼的问题——也是一个比较令某些欧美程序员无法理解的问题。我曾经被人说“你也就用不了几个字符,甚至26个英文字母你都用不全,你干嘛要纠结字符的加载和缓存的问题呢?”以及“我告诉你,不要用输入法,你别指望输入法能拯救你那少得可怜的词汇量。我认为使用输入法的程序员都是外行。”……等各种令我们这些母语不是ASC
II
的人感到困惑的言论。

单片机的ROM一般不会多到能让你随便存下几张照片的,就别说GB2312那么多汉字了。在Unicode从0x20到0xFF
FF
之间,我们的GB2312编码的字符个数大概是75
41
个。这些汉字基本足够使用了,但依然有很多生僻字是无法显示的。为了解决这些生僻字,就有了GBK,但单片机的话还是不讲究了。

通常情况下我们解决字体显示用的是FreeType库,用它来解析ttf格式的字体文件然后动态绘制、缓存。但这个库用在单片机上是不现实的。所以单片机的字体绘制基本靠的是位图打点绘制的过程。

说白了就是每个字符生成一个位图,然后把位图拿去绘图,就是单片机的常用做法了。

20190401210329.png

图中的文件名是按照Unicode字符编号命名的,而不是GB2312编码。

这些字模是我自己写的一个字模生成器生成的。你可以选择字体和大小,以及生成的BMP的格式。实际用在单片机上的时候,你是要去掉这些bmp文件的文件头的,因为都是些重复的信息(除了每个字的宽高以外)。
生成字模的原理用的是TextOut()这个API来绘制文字,然后把绘制的文字存储为文件。

而字体的选择用的是CreateFont()这个API。将其选入HDC句柄后就可以让TextOut()的行为按照指定字体来绘制。

20190401210957.png
(字体预览用的文章出处:微信公众号 利维坦《放心,有性感缺失的不是你一个》  转侵删)

对于较小的字体,它只有黑白两色,用1bit存储一个像素的方式是最合适不过的了。对于单片机也是最合适的。不过,对于平均12x12像素的文字,7541个字符,需要7541x12x12/8 = 7541 x 18 = 135738 Bytes ≈ 133 KiB,而这个大小其实已经超出了Blue Pill上面带的单片机STM32F103C8T6的ROM容量128 KiB。目测如果真要投入应用,它应该是存储了一部分在SD卡以及类似的存储器里然后由单片机读取使用的。

对于存储容量稍大一点的单片机,或者其它物联网机器比如树莓派、香蕉派,带一个自己编程外设控制的屏幕,则可以选用较大的、带抗锯齿的字体。对于这样的字体,我生成的位图是8-bit调色板格式、256色,调色板起到一个预览的时候提示灰度值的作用。实际存储的是一字节一像素的灰度值,0表示“无”或者“白底”,255表示“有”或者“黑字”。

20190401210834.png

20190401211856.png

字模生成器src: gbkbmp.zip (83.66 KB, 下载次数: 5)

25

主题

108

帖子

1492

积分

用户组: 版主

UID
1821
精华
6
威望
57 点
宅币
1199 个
贡献
41 次
宅之契约
0 份
在线时间
244 小时
注册时间
2016-7-12
发表于 2019-4-2 14:04:22 | 显示全部楼层
本帖最后由 Ayala 于 2019-4-2 14:07 编辑

一个12号字用18bytes太奢侈了 应该选择一种合适的树压缩它

1041

主题

2328

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
217
威望
288 点
宅币
18063 个
贡献
36605 次
宅之契约
0 份
在线时间
1732 小时
注册时间
2014-1-26
 楼主| 发表于 2019-4-2 21:40:52 | 显示全部楼层
Ayala 发表于 2019-4-2 14:04
一个12号字用18bytes太奢侈了 应该选择一种合适的树压缩它

确实…在考虑用zlib压缩

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2019-8-21 04:35 , Processed in 0.105036 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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