打印漢字點陣


漢字點陣

在漢字的點陣字庫中,每個字節的每個位都代表一個漢字的一個點,每個漢字都是由一個矩形的點陣組成,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");

輸出效果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM