1汉字的机内码、区位码编码规则和字形数据存储格式
1.1汉字区位码
为了使每一个汉字有一个全国统一的代码,1980年,我国颁布了第一个汉字编码的国家标准: GB2312-80《信息交换用汉字编码字符集》基本集,这个字符集是我国中文信息处理技术的发展基础,也是目前国内所有汉字系统的统一标准。由于国标码是四位十六进制,为了便于交流,大家常用的是四位十进制的区位码。所有的国标汉字与符号组成一个94×94的矩阵。在此方阵中,每一行称为一个"区",每一列称为一个"位",因此,这个方阵实际上组成了一个有94个区(区号分别为1到94)、每个区内有94个位(位号分别为1到94)的汉字字符集。一个汉字所在的区号和位号简单地组合在一起就构成了该汉字的"区位码"。在汉字的区位码中,高两位为区号,低两位为位号。 在区位码中,01-09区为682个特殊字符,16~87区为汉字区,包含6763个汉字 。其中16-55区为一级汉字(3755个最常用的汉字,按拼音字母的次序排列),56-87区为二级汉字(3008个汉字,按部首次序排列)。
所以,当我们需要n个任意汉字时,我们不必建一个全部汉字表,而是利用区位码实现常用汉字的提取。
1.2汉字的机内码
汉字的机内码是指在计算机中表示一个汉字的编码。
机内码与区位码稍有区别
为了避免机内码与基本 ASCII 码的冲突,需要避开基本 ASCII 码中的控制码(00H~1FH),还需与基本 ASCII 码中的字符相区别。
为了实现这两点,可以先在区码和位码分别加上 20H,在此基础上再加 80H (此处“ H ”表示前两位数字为十六进制数)。
经过这些处理,用机内码表示一个汉字需要占两个字节,分别称为高位字节和低位字节,这两位字节的机内码按如下规则表示:
高位字节 = 区码 + 20H + 80H(或区码 + A0H)
低位字节 = 位码 + 20H + 80H(或位码 + AOH)
由于汉字的区码与位码的取值范围的十六进制数均为 01H ~ 5EH (即十进制的 01 ~ 94),所以汉字的高位字节与低位字节的取值范围则为 A1H ~ FEH (即十进制的 161~254 )。
1.3点阵字库存储
在汉字的点阵字库中,每个字节的每个位都代表一个汉字的一个点,每个汉字都是由一个矩形的点阵组成,0 代表没有,1 代表有点,将 0 和 1 分别用不同颜色画出,就形成了一个汉字,常用的点阵矩阵有 12 * 12, 14 * 14, 16 * 16 三种字库。
字库根据字节所表示点的不同有分为横向矩阵和纵向矩阵,目前多数的字库都是横向矩阵的存储方式,我们接下去所描述的都是指横向矩阵字库。
1.4汉字点阵在汉字库中的地址计算公式
汉字库种类繁多,但都是按照区位的顺序排列的。
前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录 94 个汉字,位号则为该字在该区中的位置。
计算公式为:
(94*(区号-1)+位号-1) * 一个汉字字模占用字节数
1
对于 16 点阵的字库,1 个汉字字模占用 32 字节。
对于 12 点阵字库,字摸每行的位数均补齐为 8 的整数倍,于是实际该字库的位长度是 16*12,即占用 24 字节。
我们在计算机中常用的汉字编码为汉字内码,不是区位码,需要进行转换。
因此最终的计算公式为:
ADDRESS = [(内码 1-0xa1) * 94 + (内码 2-0xa1)] * 32
1.5 16*16 点阵字库
对于 16*16 的矩阵来说,它所需要的位数共是 16 * 16=256 个位,每个字节为 8 位,因此,每个汉字都需要用 256 / 8 = 32 个字节来表示。
即每两个字节代表一行的 16 个点,共需要 16 行,显示汉字时,只需一次性读取 32 个字节,并将每两个字节为一行打印出来,即可形成一个汉字。
2Ubuntu 下调用 opencv 在图片显示汉字和数字
2.1实验准备和过程
创建文件夹
进入虚拟机,终端键入命令:lattice ;
并进入文件夹:cd lattice.
将需要的项目文件及图片下载放置在该文件夹下
编写代码
#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="/home/mayfly/lattice/photo.jpg";
char* logo_path=(char*)"/home/mayfly/lattice/logo.txt";
put_text_to_image(450,750,image_path,logo_path);//安排文字从图片像素坐标(450,750)开始显示
return 0