汉字点阵 在汉字的点阵字库中,每个字节的每个位都代表一个汉字的一个点,每个汉字都是由一个矩形的点阵组成,0代表没有,1代表有点,将0和1分别用不同颜色画出,就形成了一个
在汉字的点阵字库中,每个字节的每个位都代表一个汉字的一个点,每个汉字都是由一个矩形的点阵组成,0代表没有,1代表有点,将0和1分别用不同颜色画出,就形成了一个汉字,常用的点阵矩阵有12 * 12, 14 * 14, 16 * 16三种字库。
我:第46区第50位。 hzk: 16*16点阵
offset(汉字偏移量) : ((区号 - 1) * 94 +(位号 - 1) ) * 32
先尝试打印1个汉字点阵:/*读取16*16的汉字库文件,显示指定的汉字点阵到字符界面上*/
unsigned char mat[16][2];//存储待显示汉字的点阵:16*16占32个字节
unsigned char chinese[3] = "爱";//待显示的汉字
FILE* hzk; //指向汉字库文件的指针
if ((hzk = fopen("hzk16.txt", "rb")) == NULL)
{
printf("hzk16.txt文件不存在或者打开错误!");
exit(0);
}
int i = chinese[0] - 0xa0;//计算汉字的区号
int j = chinese[1] - 0xa0;//计算汉字的位号
long offset = ((i - 1) * 94 + (j - 1)) * 32;//计算当前汉字在汉字库文件中的偏移量
fseek(hzk, offset, SEEK_SET);//从文件开始定位指针到该字的偏移量处
fread(mat, 32, 1, hzk); //读取32个字节到字模数组中
for (i = 0; i < 16; ++i)//循环显示点阵的每一行
{
//每一行显示2个字节的点阵信息
for (j = 0; j < 2; ++j)
{
//显示一个字节的8个比特信息
for (int k = 0; k < 8; ++k)
{
if (mat[i][j] & (0x80 >> k))//该位为1
{
printf("o");
}
else
{
printf(" ");
}
}
}
printf("\n"); //每行打印完换行
}
fclose(hzk);
之后尝试多个字符显示:
得注意汉字不是一个接一个输出,而是先输出则会整个第一行
/*读取16*16的汉字库文件,显示多个汉字(注意不能太多,否则控制台显示不下)点阵到字符界面上*/
unsigned char mat[16][2];//存储待显示汉字的点阵:16*16占32个字节
unsigned char chinese[] = "人与世界";//待显示的汉字
FILE* hzk; //指向汉字库文件的指针
if ((hzk = fopen("hzk16.txt", "rb")) == NULL)
{
printf("hzk16.txt文件不存在或者打开错误!");
exit(0);
}
for (int i = 0; i < 16; ++i)//循环显示点阵的每一行
{
//显示字符串中所有汉字的第i行
for (int index = 0; index < strlen((char*)chinese) / 2; index++)
{
int i0 = chinese[index * 2] - 0xa0;//计算汉字的区号
int j0 = chinese[index * 2 +1 ] - 0xa0;//计算汉字的位号
long offset = ((i0 - 1) * 94 + (j0 - 1)) * 32;//计算当前汉字在汉字库文件中的偏移量
fseek(hzk, offset, SEEK_SET);//从文件开始定位指针到该字的偏移量处
fread(mat, 32, 1, hzk); //读取32个字节到字模数组中
//每一行显示2个字节的点阵信息
for (int j = 0; j < 2; ++j)
{
//显示一个字节的8个比特信息
for (int k = 0; k < 8; ++k)
{
if (mat[i][j] & (0x80 >> k))//该位为1
{
printf("o");
}
else
{
printf(" ");
}
}
}
}
printf("\n"); //每行打印完换行
}
fclose(hzk);
输出效果:
尝试把汉字输入到文件中去:
/*读取16*16的汉字库文件,显示多个汉字点阵到文本文件中*/
unsigned char mat[16][2];//存储待显示汉字的点阵:16*16占32个字节
unsigned char chinese[] = "东风快递";//待显示的汉字
FILE* hzk; //指向汉字库文件的指针
FILE* fout;
if ((hzk = fopen("hzk16.txt", "rb")) == NULL)
{
printf("hzk16.txt文件不存在或者打开错误!");
exit(0);
}
fout = freopen("hz.txt", "w", stdout); //将标准输出流stdout(代表显示器)的数据重定向到文件中
for (int i = 0; i < 16; ++i)//循环显示点阵的每一行
{
//显示字符串中所有汉字的第i行
for (int index = 0; index < strlen((char*)chinese) / 2; index++)
{
int i0 = chinese[index * 2] - 0xa0;//计算汉字的区号
int j0 = chinese[index * 2 +1 ] - 0xa0;//计算汉字的位号
long offset = ((i0 - 1) * 94 + (j0 - 1)) * 32;//计算当前汉字在汉字库文件中的偏移量
fseek(hzk, offset, SEEK_SET);//从文件开始定位指针到该字的偏移量处
fread(mat, 32, 1, hzk); //读取32个字节到字模数组中
//每一行显示2个字节的点阵信息
for (int j = 0; j < 2; ++j)
{
//显示一个字节的8个比特信息
for (int k = 0; k < 8; ++k)
{
if (mat[i][j] & (0x80 >> k))//该位为1
{
fprintf(fout,"o");
}
else
{
fprintf(fout," ");
}
}
}
}
fprintf(fout,"\n"); //每行打印完换行
}
fclose(hzk);
fclose(fout);
freopen("CON", "w", stdout);//CON为windows操作系统的命令行窗口的输入
printf("点阵显示完毕,请查看文件hz.txt");
输出效果: