打印汉字点阵如何实现高清晰度输出?

2026-05-17 10:561阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1076个文字,预计阅读时间需要5分钟。

汉字点阵+汉字的点阵库中,每个字节的每个位都代表汉字的一个点。每个汉字由一个矩阵的点阵组成,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"); 输出效果:

标签:字库

本文共计1076个文字,预计阅读时间需要5分钟。

汉字点阵+汉字的点阵库中,每个字节的每个位都代表汉字的一个点。每个汉字由一个矩阵的点阵组成,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"); 输出效果:

标签:字库