python获取中文字体点阵坐标_点阵汉字显示 - freecamel的个人空间 - OSCHINA - 中文开源技术交流社区...
目錄: DOS下的點(diǎn)陣漢字 漢字的內(nèi)碼 漢字字模 漢字庫(kù)文件 打印字庫(kù)文件和HZK12
main()
{
unsigned char *s,*e="ABcd",*c="你好";
clrscr();
printf("English char =");
s=e;
while(*s!=0) /*C的字符串以0為結(jié)束符*/
{
printf("%3d,",*s);
s++;
}
printf("\nChinease char=");
s=c;
while(*s!=0)
{
printf("%3d,",*s);
s++;
}
getch();
}
再用TC輸入*.txt打開(kāi)運(yùn)行,看見(jiàn)了沒(méi)有,那些數(shù)值即英文和漢字的各字節(jié)內(nèi)碼。
而中文的“你”在字模中卻是這樣記載的:
在硬件系統(tǒng)內(nèi),英文的字模信息一般固化在ROM里,即使在沒(méi)有進(jìn)入系統(tǒng)的CMOS里,也可以讓你看到英文字符。而在DOS下,中文的字模信息一般記錄在漢字庫(kù)文件HZK16里。
了解字母和漢字是按字 模位信息顯示的原理后,那如何得到漢字的字模信息呢?難道要我們自己去做?NO。DOS前輩們經(jīng)過(guò)艱辛的努力,將制作好的字模放到了一個(gè)個(gè)標(biāo)準(zhǔn)的庫(kù)中以免 去后輩的麻煩,這就是點(diǎn)陣字庫(kù)文件。一般我們使用16*16的點(diǎn)陣宋體字庫(kù),所謂16*16,是每一個(gè)漢字在縱、橫各16點(diǎn)的區(qū)域內(nèi)顯示的。不過(guò)后來(lái)又有 了HZK12、HZK24,HZK32和HZK48字庫(kù)及黑體、楷體和隸書字庫(kù)。雖然漢字庫(kù)種類繁多,但都是按照區(qū)位的順序排列的。前一個(gè)字節(jié)為該漢字的 區(qū)號(hào),后一個(gè)字節(jié)為該字的位號(hào)。每一個(gè)區(qū)記錄94個(gè)漢字,位號(hào)則為該字在該區(qū)中的位置。因此,漢字在漢字庫(kù)中的具體位置計(jì)算公式為:94*(區(qū)號(hào)-1)+ 位號(hào)-1。減1是因?yàn)閿?shù)組是以0為開(kāi)始而區(qū)號(hào)位號(hào)是以1為開(kāi)始的。這僅為以漢字為單位該漢字在漢字庫(kù)中的位置,那么,如何得到以字節(jié)為單位得到該漢字在漢 字庫(kù)中的位置呢?只需乘上一個(gè)漢字字模占用的字節(jié)數(shù)即可,即:(94*(區(qū)號(hào)-1)+位號(hào)-1)*一個(gè)漢字字模占用字節(jié)數(shù),而按每種漢字庫(kù)的漢字大小不同 又會(huì)得到不同的結(jié)果。以16*16點(diǎn)陣字庫(kù)為例,計(jì)算公式則為:(94*(區(qū)號(hào)-1)+(位號(hào)-1))*32。漢字庫(kù)文該從該位置起的32字節(jié)信息即記錄 了該字的字模信息。
漢字庫(kù)文件
了解點(diǎn)陣漢字及漢字庫(kù)的構(gòu)成原理后,顯示漢字就變得簡(jiǎn)單。以16*16點(diǎn)陣字庫(kù)為例,通常的方法是:將文件工作指針移到需要的漢字字模處、將漢字庫(kù)文件讀入一2*16數(shù)組再用for循環(huán)一位位地顯示。以使用VGAHI模式顯示“我”字為例,程序如下:#include "graphics.h"
#include "stdio.h"
main()
{
int i=VGA,j=VGAHI,k;
unsigned char mat[16][2],chinease[3]="我";
FILE *HZK;
if((HZK=fopen("hzk16","rb"))==NULL)
exit(0);
initgraph(&i,&j,"");
i=chinease[0]-0xa0;j=chinease[1]-0xa0; /*獲得區(qū)碼與位碼*/
fseek(HZK,(94*(i-1)+(j-1))*32l,SEEK_SET);
fread(mat,32,1,HZK);
for(j=0;j<16;j++)
for(i=0;i<2;i++)
for(k=0;k<8;k++)
if(mat[j][i]&(0x80>>k)) /*測(cè)試為1的位則顯示*/
putpixel(i*8+k,j,WHITE);
getch();
closegraph();
fclose(HZK);
}怎么樣?只要掌握了正確的方法,顯示漢字并不復(fù)雜。
如果你有UCDOS的 HZK24S(宋體)、HZK24K(楷體)或HZK24H(黑體),你還可以使用不同字體的大字模漢字了。HZK24系列是24*24的點(diǎn)陣字庫(kù),每字 模占用3*24字節(jié)。如果你按照HZK16的顯示方法的話,你會(huì)看到......呵呵,字被放倒了。這是因?yàn)樵擃愖謳?kù)與一般的漢字庫(kù)不同,這類大字模漢字 庫(kù)是專供打印的打印字庫(kù),為了打印的方便將字模都放倒了,你使用時(shí),只要將字模的位信息縱橫轉(zhuǎn)置顯示即可。例如你如果定義為mat[24][3]則應(yīng)該這 樣輸出:for(i=0;i<24;i++)
for(j=0;j<24;j++)
if((0x80>>i%8)&mat[j][i/8]) /*轉(zhuǎn)置顯示*/
putpixel(j+x,y+i,color);還有一類字庫(kù)HZK12,雖然屬于標(biāo)準(zhǔn)字庫(kù)類型,但如果你將它的字模 當(dāng)作12*12位計(jì)算的話,根本無(wú)法正常顯示漢字。因?yàn)樽謳?kù)設(shè)計(jì)者為了使用的方便,字摸每行的位數(shù)均補(bǔ)齊為8的整數(shù)倍,于是實(shí)際該字庫(kù)的位長(zhǎng)度是 16*12,雖然每行都多出了4位,但這4位都是0(不顯示),并不影響顯示效果。
總結(jié)
以上是生活随笔為你收集整理的python获取中文字体点阵坐标_点阵汉字显示 - freecamel的个人空间 - OSCHINA - 中文开源技术交流社区...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: plsql清完表需不需要提交事务_分布式
- 下一篇: 如何自动填充网页表单_iCab for