目录

一、汉子点阵字库原理

二、实验

​三、总结

四、参考


一、汉子点阵字库原理

(1) 汉字编码
1. 区位码
在国标 GD2312—80 中规定,所有的国标汉字及符号分配在一个 94 行、94 列的方
阵中,方阵的每一行称为一个“区”,编号为 01 区到 94 区,每一列称为一个“位”,编号为
01 位到 94 位,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉
伯数字就是它们的“区位码”。 区位码的前两位是它的区号,后两位是它的位号。 用区位码就
可以唯一地确定一个汉字或符号,反过来说,任何一个汉字或符号也都对应着一个唯一的
区位码。汉字“母”字的区位码是 3624,表明它在方阵的 36 区 24 位,问号“?”的区位码为
0331,则它在 03 区 3l 位。
2. 机内码
汉字的机内码是指在计算机中表示一个汉字的编码。机内码与区位码稍有区别。如上所
述,汉字区位码的区码和位码的取值均在 1~94 之间,如直接用区位码作为机内码,就会
与基本 ASCII 码混淆。为了避免机内码与基本 ASCII 码的冲突,需要避开基本 ASCII 码
中的控制码(00H~1FH),还需与基本 ASCII 码中的字符相区别。为了实现这两点,可以
先在区码和位码分别加上 20H,在此基础上再加 80H(此处“H”表示前两位数字为十六进制
数)。经过这些处理,用机内码表示一个汉字需要占两个字节,分别 称为高位字节和低位字
节,这两位字节的机内码按如下规则表示:
高位字节 = 区码 + 20H + 80H( 或区码 + A0H)
低位字节 = 位码 + 20H + 80H( 或位码 + AOH)
由于汉字的区码与位码的取值范围的十六进制数均为 01H~5EH(即十进制的 01~9
4),所以汉字的高位字节与低位字节的取值范围则为 A1H~FEH(即十进制的 161~254)。
例如,汉字“啊”的区位码为 1601,区码和位码分别用十六进制表示即为 1001H,它
的机内码的高位字节为 B0H,低位字节为 A1H,机内码就是 B0A1H。(2)二、 点阵字库结构
1. 点阵字库存储
在汉字的点阵字库中,每个字节的每个位都代表一个汉字的一个点,每个汉
字都是由一个矩形的点阵组成,0 代表没有,1 代表有点,将 0 和 1 分别用不同
颜色画出,就形成了一个汉字,常用的点阵矩阵有 12*12, 14*14, 16*16 三
种字库。
字库根据字节所表示点的不同有分为 横向矩阵和 纵向矩阵,目前多数的字库
都是 横向矩阵的存储方式(用得最多的应该是早期 UCDOS 字库), 纵向矩阵一
般是因为有某些液晶是采用纵向扫描显示法,为了提高显示速度,于是便把字库
矩阵做成纵向,省得在显示时还要做矩阵转换。我们接下去所描述的都是指横向
矩阵字库。
2. 16*16 点阵字库
对于 16*16 的矩阵来说,它所需要的位数共是 16*16=256 个位,每个字
节为 8 位,因此,每个汉字都需要用 256/8=32 个字节来表示。
即每两个字节代表一行的 16 个点,共需要 16 行,显示汉字时,只需一次
性读取 32 个字节,并将每两个字节为一行打印出来,即可形成一个汉字。
点阵结构如下图所示:

3. 14*14 与 与 12*12 点阵字库
对于 14*14 和 12*12 的字库,理论上计算,它们所需要的点阵分别为(14
*14/8)=25, (12*12/8)=18 个字节,但是,如果按这种方式来存储,那么取
点阵和显示时,由于它们每一行都不是 8 的整位数,因此,就会涉到点阵的计
算处理问题,会增加程序的复杂度,降低程序的效率。
为了解决这个问题,有些点阵字库会将 14*14 和 12*12 的字库按 16*14
和 16*12 来存储,即,每行还是按两个字节来存储,但是 14*14 的字库,每
两个字节的最后两位是没有使用,12*12 的字节,每两字节的最后 4 位是没有
使用,这个根据不同的字库会有不同的处理方式,所以在使用字库时要注意这个
问题,特别是 14*14 的字库。
三、 汉字点阵获取
1. 利用区位码获取汉字
汉字点阵字库是根据区位码的顺序进行存储的,因此,我们可以根据区位来
获取一个字库的点阵,它的计算公式如下:
点阵起始位置 = (( 区码- 1)*94 + ( 位码 – 1)) * 汉字点阵字节数
获取点阵起始位置后,我们就可以从这个位置开始,读取出一个汉字的点阵。
2. 利用汉字机内码获取汉字
前面我们己经讲过,汉字的区位码和机内码的关系如下:
机内码高位字节 = 区码 + 20H + 80H( 或区码 + A0H)
机内码低位字节 = 位码 + 20H + 80H( 或位码 + AOH)
反过来说,我们也可以根据机内码来获得区位码:
区码 = 机内码高位字节 - A0H
位码 = 机内码低位字节 - AOH

二、实验

实验准备

一张图片,24*24的点阵.hz文件,ASCII码.zf文件,需要显示的文本文件

(1)创建一个文件夹123,并将实验准备文件在里面

(3)创建wor.cpp文件并打开写入代码

gedit word.cpp

将下列代码写入文件中

#include<iostream>
#include<opencv/cv.h>
#include"opencv2/opencv.hpp"
#include<opencv/cxcore.h>
#include<opencv/highgui.h>
#include<math.h>using namespace cv;
using namespace std;void paint_chinese(Mat& image,int x_offset,int y_offset,unsigned long offset);
void paint_ascii(Mat& image,int x_offset,int y_offset,unsigned long offset);
void put_text_to_image(int x_offset,int y_offset,String image_path,char* logo_path);int main(){String image_path="3.png";//图片的名字char* logo_path="logo.txt";//汉字文件的名字put_text_to_image(200,350,image_path,logo_path);//change txt placereturn 0;
}void paint_ascii(Mat& image,int x_offset,int y_offset,unsigned long offset){//绘制的起点坐标Point p;p.x = x_offset;p.y = y_offset;//存放ascii字膜char buff[16];           //打开ascii字库文件FILE *ASCII;if ((ASCII = fopen("Asci0816.zf", "rb")) == NULL){printf("Can't open ascii.zf,Please check the path!");//getch();exit(0);}fseek(ASCII, offset, SEEK_SET);fread(buff, 16, 1, ASCII);int i, j;Point p1 = p;for (i = 0; i<16; i++)                  //十六个char{p.x = x_offset;for (j = 0; j < 8; j++)              //一个char八个bit{p1 = p;if (buff[i] & (0x80 >> j))    /*测试当前位是否为1*/{/*由于原本ascii字膜是8*16的,不够大,所以原本的一个像素点用4个像素点替换,替换后就有16*32个像素点ps:感觉这样写代码多余了,但目前暂时只想到了这种方法*/circle(image, p1, 0, Scalar(0, 0, 255), -1);p1.x++;circle(image, p1, 0, Scalar(0, 0, 255), -1);p1.y++;circle(image, p1, 0, Scalar(0, 0, 255), -1);p1.x--;circle(image, p1, 0, Scalar(0, 0, 255), -1);}                       p.x+=2;            //原来的一个像素点变为四个像素点,所以x和y都应该+2}p.y+=2;}
}
void paint_chinese(Mat& image,int x_offset,int y_offset,unsigned long offset){//在图片上画汉字Point p;p.x=x_offset;p.y=y_offset;FILE *HZK;char buff[72];//72个字节,用来存放汉字的if((HZK=fopen("HZKf2424.hz","rb"))==NULL){printf("Can't open HZKf2424.hz,Please check the path!");exit(0);//退出}fseek(HZK, offset, SEEK_SET);/*将文件指针移动到偏移量的位置*/fread(buff, 72, 1, HZK);/*从偏移量的位置读取72个字节,每个汉字占72个字节*/bool mat[24][24];//定义一个新的矩阵存放转置后的文字字膜int i,j,k;for (i = 0; i<24; i++)                 /*24x24点阵汉字,一共有24行*/{for (j = 0; j<3; j++)                /*横向有3个字节,循环判断每个字节的*/for (k = 0; k<8; k++)              /*每个字节有8位,循环判断每位是否为1*/if (buff[i * 3 + j] & (0x80 >> k))    /*测试当前位是否为1*/{mat[j * 8 + k][i] = true;          /*为1的存入新的字膜中*/}else {mat[j * 8 + k][i] = false;}}for (i = 0; i < 24; i++){p.x = x_offset;for (j = 0; j < 24; j++){     if (mat[i][j])circle(image, p, 1, Scalar(255, 0, 0), -1);         //写(替换)像素点p.x++;                                                //右移一个像素点}p.y++;                                                    //下移一个像素点}
}void put_text_to_image(int x_offset,int y_offset,String image_path,char* logo_path){//将汉字弄上图片
//x和y就是第一个字在图片上的起始坐标//通过图片路径获取图片Mat image=imread(image_path);int length=19;//要打印的字符长度(打印多少字节长度就为多少,根据自己的情况调整)unsigned char qh,wh;//定义区号,位号unsigned long offset;//偏移量unsigned char hexcode[30];//用于存放记事本读取的十六进制,记得要用无符号FILE* file_logo;if ((file_logo = fopen(logo_path, "rb")) == NULL){printf("Can't open txtfile,Please check the path!");//getch();exit(0);}fseek(file_logo, 0, SEEK_SET);fread(hexcode, length, 1, file_logo);int x =x_offset,y = y_offset;//x,y:在图片上绘制文字的起始坐标for(int m=0;m<length;){if(hexcode[m]==0x23){break;//读到#号时结束}else if(hexcode[m]>0xaf){qh=hexcode[m]-0xaf;//使用的字库里是以汉字啊开头,而不是以汉字符号开头wh=hexcode[m+1] - 0xa0;//计算位码offset=(94*(qh-1)+(wh-1))*72L;paint_chinese(image,x,y,offset);/*计算在汉字库中的偏移量对于每个汉字,使用24*24的点阵来表示的一行有三个字节,一共24行,所以需要72个字节来表示*/m=m+2;//一个汉字的机内码占两个字节,x+=24;//一个汉字为24*24个像素点,由于是水平放置,所以是向右移动24个像素点}else{//当读取的字符为ASCII码时wh=hexcode[m];offset=wh*16l;//计算英文字符的偏移量paint_ascii(image,x,y,offset);m++;//英文字符在文件里表示只占一个字节,所以往后移一位就行了x+=16;}}cv::imshow("image", image);cv::waitKey();
}

(4)运行代码,没有报错

(4) ./word运行

三、总结

在了解汉子点阵的编码规则后,我们就可以在图片上显示文字。

四、参考

51单片机教程:8*8 点阵显示字符、数字、简单汉字_mbs706的博客-CSDN博客

虚拟机下点阵汉字的字模读取与显示相关推荐

  1. Ubuntu下点阵汉字的字模读取与显示

    文章目录 一.汉字的区位码.机内码编码规则 1.GB2312标准 2.区位码 3.机内码 二.字形数据存储格式 1. Unicode 字符集和编码 2.字模 3.汉字点阵获取 三.在图片上叠加显示学号 ...

  2. STM32的串口传输文件和点阵汉字的字模读取与显示

    文章目录 一.串口传输文件 1.题目要求 2.实验过程 二.汉字点阵原理 1.汉字编码 2.点库字库结构 3.汉字点阵获取 三.Ubuntu下显示图片和文字 1.实验要求 2.实验准备 3.编写代码 ...

  3. 嵌入式系统基础:点阵汉字的字模读取与显示

    点阵汉字的字模读取与显示 虚拟机:VitrualBox 6 系统:Ubuntu 18 函数库:OpenCV 3.4(涉及到图像编程) 文章目录 点阵汉字的字模读取与显示 一.汉字点阵字库原理 1. 汉 ...

  4. Ubuntu下利用Opencv进行点阵汉字的字模读取与显示

    前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容. 提示:以下是本篇文章正文内容, ...

  5. 【嵌入式】在Ubuntu系统下通过OpenCV实现点阵汉字的字模读取与显示

    介绍汉字点阵的原理,理解汉字的机内码.区位码编码规则和字形数据存储格式,通过OpenCV在Ubuntu系统下显示点阵汉字 一.汉字点阵原理 1.汉字点阵原理 1.点阵 2.汉字编码 3.点阵字库存储 ...

  6. pc机之间的通信和点阵汉字的字模读取与显示

    pc机之间的通信 连线设置 点阵汉字的读取与打印 在ubuntu下面用c调用opencv显示文字和图片 总结 连线设置 两个usb转换口 G-G,3.3-3.3,TX-RX,RX-TX 打开串口助手选 ...

  7. 汉字点阵原理字模读取与显示

    目录 一.汉字点阵字库原理 (一)汉字编码 (二)点阵字库结构 (三)汉字点阵获取 二.点阵汉字的字模读取与显示 三.总结 参考文献 一.汉字点阵字库原理 (一)汉字编码 国家标准信息交换用汉字字符集 ...

  8. 代码随笔——点阵汉字在LCD上的显示

    代码随笔--点阵汉字在LCD上的显示 注:本文约在半年到一年前写的. 其实我以前从没想过写Framebuffer的代码,网上流传较多的是LCD的移植(主要改参数),之后没下文了.不过,曾经兴致冲冲地想 ...

  9. 汉字的动态编码与显示方案

    摘要:综合几种常用单片机汉字显示方案,提出一种基于PC机预处理的汉字动态编码和动态字库的显示方法,较好地解决了存储空间.显示速度.软件开发维护几方面的相互矛盾:具有平台化的优点,同时,给出针对MCS5 ...

最新文章

  1. 开源生态也难逃“卡脖子”危机?中国AI开发者的警醒和突围
  2. SpringBoot第十八篇: 定时任务(Scheduling Tasks)
  3. 深圳惠程澄清与奇虎360公司重组传闻
  4. 多元时代个人信息更需强有力保护
  5. ec200s 方案 移远_移远 4G Cat 1 无线通信模块EC200S
  6. 《CCNA安全640-554认证考试指南》——第6章在Cisco IOS设备上保护管理层
  7. linux5.8下oracle10g安装和配置详解
  8. 用U盘安装一个Linux系统
  9. Android开源代码解读のOnScrollListener实现ListView滚屏时不加载数据
  10. 《HelloGitHub》第 13 期
  11. 名编辑电子杂志大师教程 | PDF制作排版设计建议
  12. 华师本科网络英语 计算机统考,2020华中师大计算机考研经验帖(已上岸)
  13. PPC手机新手教程,使用方法,疑难解答,最强大的PPC手机使用手则
  14. Python—WebSocket爬虫实战
  15. Mysql数据库读写分离的实现
  16. 基于FPGA的简单视频传输方案设计
  17. 云平台运维的一些心得
  18. Silverlight开发历程—(绘制放射渐变图形)
  19. cscd期刊是c刊吗_武工商C刊和北大核心期刊论文发表数量位列全省同类高校前三甲...
  20. Java实例——Java方法

热门文章

  1. java 牛客网之[动态规划 简单]NC4 【模板】前缀和
  2. Memtest86安装详细教程
  3. 华为电脑linux指纹,华为朱臣才:MateBook指纹解锁仅需一触
  4. arm qt mysql插件,关于移植QT的Sqlite数据库到ARM板运行的问题
  5. 数据库中的常用的数据模型 层次模型 网状模型 关系模型
  6. 计算机去专业去马来读硕士,【马来西亚留学专业资讯】马来西亚留学热门专业资讯分析...
  7. 差点就与华为Offer无缘?HUAWEI 4面技术5面HR,踩线挺过
  8. shodan搜索附近摄像头_深夜,摄像头前惊现一团白光!不明光源,村民心慌
  9. threejs实现3d全景看房
  10. Unity3D Shader 入门第一天