一、字模提取原理

无非就是从字库文件中读取出字模数据。

以常用的HZK16字库文件为例:该字库文件是符合GB2312国家标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个。其中一级汉字有 3755个,按声序排列,二级汉字有3008个,按偏旁部首排列。

一个字节为8bit,用一个bit位来表示点阵中的一个点的话,16×16点阵需要16*16/8 = 32个字节才能达到显示一个普通汉字的目的。

GBK码也称为区位码,在字库文件中分为94个区。GB2312汉字都是由2字节组成的,第一个字节则是区码,第二个字节则是位码。HZK16字库文件中,汉字区码和位码的起始偏移量都为0xA1(不同的字库偏移量可能不同),故有如下计算公式:

                 偏移量 = (94*(区码-0xA1)+(位码-0xA1))*32;

以ASC16字库文件为例:在ASC16字库文件中,没有区位的说法,其偏移量就是ASCII码值。由于是ASCII字符,只占1个字节,其宽度只有8。故一个ASCII字符占用16*8/8=16个字节数据。故有如下公式:

                                                       偏移量 = ASCII码值*16;

二、图示

汉字 "强"  (0x7CBF)

ASCII值 "2" (0x32)

三、LED扫描方式、顺序、方向、阴阳码

得到字模数据后大多数情况不能直接使用,因为LED屏幕大部分情况下是以动态刷新的方式来显示的,字模数据需要根据LED显示屏的扫描方式进行调整,才能满足不同系统的要求,其实无非就是调换字模数据的排列顺序或者对字模数据取反。

四、示例代码

1、汉字 HZK16 字模提取  16*16

#include<stdio.h>
#include <string.h>void Bytes_Read_from_HZK( unsigned char *s, char * chs)
{FILE *fp;unsigned long offset;int ret = 0;int i = 0;int j = 0;int k = 0;unsigned char key[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//offset = ((s[0] - 0xb0) * 94 + (s[1] - 0xa1)) * 32; //根据内码找出汉字在HZK中的偏移位置,不同的字库可能偏移位置不同offset = (94*(unsigned int)(s[0]-0xA1)+(s[1]-0xA1))*32;if ((fp = fopen("HZK16", "rb+")) == NULL)return; //打开字库文件fseek(fp, offset, SEEK_SET); //文件指针偏移到要找的汉字处ret = fread(chs, 32, 1, fp); //读取该汉字32个字节的字模数据printf("ret = %d\n",ret);for(k=0; k<16; k++){for(j=0; j<2; j++){for(i=0; i<8; i++){int flag = chs[k*2+j]&key[i];printf("%s", flag?"● ":"○ ");//将单个字节每个bit位的状态显示出来}}printf("\n");}fclose(fp);
}
int main(int argc,char *argv[])
{char s[2]={0xC7,0xBF};//强char chs[32]={0};char table1[16]={0};char table2[16]={0};//   memset(chs,0,32);int i = 0;int k = 0;int j = 0;Bytes_Read_from_HZK( s, chs );for(i = 0; i<32; i++){  if( i % 2 == 0 )table1[j++] = chs[i];   //由于LED扫描方式的需要,故对数据分组进行处理,调换排列顺序并取反elsetable2[k++] = chs[i];}for(i = 0; i<16 ;i++) {printf("0x%02X,", (unsigned char)(~table1[i]));  //数据取反}printf("\n");for(i = 0; i<16 ;i++){printf("0x%02X,", (unsigned char)(~table2[i]));}printf("\n");return 0;
}

2、数字、字母 ASC16 字模提取  16*8

#include<stdio.h>
#include <string.h>void Bytes_Read_from_HZK( unsigned char *s, char * chs)
{FILE *fp;unsigned long offset;int ret = 0;int i = 0;int j = 0;int k = 0;unsigned char key[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};offset = (*s) * 16;   //找出在字库中的偏移位置if ((fp = fopen("ASC16", "r+")) == NULL){printf("open fail!!\n");return; //打开字库文件}fseek(fp, offset, SEEK_SET); //文件指针偏移到要找的字符处ret = fread(chs, 16, 1, fp); //读取该字符的字模printf("ret = %d\n",ret);for(k=0; k<16; k++){for(i=0; i<8; i++){int flag = chs[k]&key[i];printf("%s", flag?"● ":"○ ");}printf("\n");}fclose(fp);
}int main(int argc,char *argv[])
{char s[1]={0x32};//数字 "2"char chs[16]={0};int i = 0;int k = 0;int j = 0;Bytes_Read_from_HZK(s, chs);for(i = 0; i<16; i++){printf("0x%02X,", (unsigned char)(~chs[i]));}printf("\n");return 0;
}

五、相关参考资料传送门:

汉字GBK码查询:

http://www.mytju.com/classCode/tools/encode_gb2312.asp

字模提取参考示例:

https://blog.twofei.com/embedded/hzk.html

字模提取原理:

https://wenku.baidu.com/view/c2b10f1eb7360b4c2e3f6443.html

字模提取软件:

http://www.eeworld.com.cn/mcu/article_2016121532319.html

字库文件下载:

https://pan.baidu.com/s/1He74KkqMl5aqsXY51Ttq_g

LED点阵字模提取学习相关推荐

  1. 基于ArduinoNano的LED点阵时钟探索(1)四合一MAX7219+DS3231

    基于ArduinoNano的LED点阵时钟探索(1)四合一MAX7219+DS3231 这篇文章是自己打算做一个LED点阵时钟记录学习进度的,刚完成第一次点亮MAX7219四合一模块,所以先做好学习记 ...

  2. 51单片机学习笔记(清翔版)(13)——LED点阵、74HC595

    如图3,点阵屏分单色和彩色,点阵屏是由许多点组成的,在一个点上,只有一颗一种颜色的灯珠,这就是单色点阵屏,彩色的在一个点上有三颗灯珠,分别是RGB三原色. 图4你可能没看出来,那么大块黄色的就是点阵屏 ...

  3. 51单片机学习:LED点阵实验(显示图像)

    实验名称:LED点阵实验(显示图像) 接线说明:     实验现象:下载程序后,8*8LED点阵显示心形 注意事项:LED点阵旁的J24黄色跳线帽短接到GND一端                   ...

  4. C# 提取字体点阵字模数据

    MCU 项目的 GUI 需要显示文字,没找到合适的,于是 , 用 Visual C# 2008 写了一个字模提取程序. 目前能导出数据,但还没来得及测试数据正确性. 项目托管地址:https://gi ...

  5. Arduino小项目设计(蜂鸣器与呼吸流水灯结合,以及led点阵)

    这还是在禹州那边弄的,应该是在10月8日的时候,怀念一下当初的设计. 我们的蜂鸣器弄的音乐是自己在乐谱上扣的,如果想要学习请点击以下, 学习怎样Arduino蜂鸣器演奏音乐 目录 1.led8*8点阵 ...

  6. 51单片机开发:通过74HC595控制LED点阵

    1.LED点阵介绍 (1)LED点阵就是多个LED发光二极管的集合,在单个LED的发光原理上没有任何区别: (2)上面是16x16的LED点阵,总共有16x16=256个LED灯,由32个引脚来控制, ...

  7. led动态显示 c语言,单片机LED点阵的纵向移动(动态显示)

    点阵的动画显示,说到底就是对多张图片分别进行取模,使用程序算法巧妙的切换图片,多张图片组合起来就成了一段动画了,我们所看到的动画片.游戏等等,它们的基本原理也都是这样的. 上一节我们学了如何在点阵上画 ...

  8. LED点阵-第1季第8部分-朱有鹏-专题视频课程

    LED点阵-第1季第8部分-1818人已学习 课程介绍         本课程是<朱有鹏老师单片机完全学习系列课程>第1季第8个课程,讲解了16*16LED点阵的驱动方式和文字显示.本课程 ...

  9. 【Proteus仿真】【51单片机】LED点阵广告牌设计

    文章目录 一.功能简介 二.软件设计 三.实验现象 联系作者 一.功能简介 本项目使用Proteus8仿真51单片机控制器,使用16*16LED点阵.按键.74HC595D等. 系统运行后,默认以静态 ...

  10. 「雕爷学编程」Arduino动手做(22)——8X8 LED点阵MAX7219屏

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

最新文章

  1. 【Codeforces】716B Complete the Word (26个字母)
  2. OpenCV识别形状
  3. 怎样做网络推广浅析怎样优化网站的导航栏?
  4. 二维LIS(CDQ分治)
  5. 【深度学习】PyTorch深度学习技术生态
  6. 下载离线插件包 谷歌浏览器的方法
  7. html遮罩实例,给原生html中添加水印遮罩层的实现示例
  8. CentOS 安装 php
  9. 简单七步,快速入门 JMeter原生压测
  10. Bootstrap 按钮菜单的尺寸
  11. 在Word中使用Quick Parts功能
  12. 【note】软件体系结构(6-10章)
  13. 【Vue】Nodejs下载与安装
  14. Red Hat Enterprise Linux 8.0 安装(全网最详细版)
  15. python第六周项目答案_Python语言程序设计-课后练习-第6周.pdf
  16. ZUC加密算法实现-软件版本Java
  17. java jdom_Java JDOM解析器
  18. R语言安装ccgarch_R语言ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测
  19. win7安装打印机 计算机,win7添加网络打印机的详细步骤【图解】
  20. vm linux安装增强功能,VirtualBox虚拟机CentOS安装增强功能Guest Additions

热门文章

  1. Windows系统语言切换问题
  2. 基于单片机的语音小车设计
  3. 微信小程序音量调节插件
  4. 烽火交换机S2000单独划分VLAN的方法
  5. 只要一行代码,批量将Word转换为PDF!
  6. [转载]微软WMV9的标准化进程受阻
  7. TCP/IP常见攻击手段
  8. 解决python写入文件数据不全的问题
  9. 大华事件检测智能服务器,大华股份发布全新智能视频监控服务器,提供高达768Mbps的存储带宽...
  10. logo字体在线设计工具