急!众位大侠,有谁知道如何定位以获取字库中的汉字点阵??

guoyh 2000-07-20 05:53:00

对于一个16x16点阵字库hzk16.fnt,汉字内码为aaff(16进制),
定位它在字库中的位置为(94*(aa-0xa1)+(ff-0xa1))*32L,
从中取32字节并显示,一切OK!

但对于ucdos的点阵字库hzk24k,我用相似的方法定位,
(94*(aa-0xa1)+(ff-0xa1))*72L,
从中取72字节并显示,结果显示的汉字不是我所要的汉字,
我测试了一下,发现该字库中的第一个汉字是‘啊’;

我想肯定是我的定位方式错了,有谁知道如何根据汉字内码
定位以获取ucdos中的汉字库中的汉字点阵??
...全文
270 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lileisy 2000-07-26
  • 打赏
  • 举报
回复
int puthz(int x,int y,int w,int color,char *p,char c)
{
unsigned int i,c1,c2,f=0;
int handle,i1,i2,i3,rec,w1,w2;
long l;
char by[72];
if(c=='s')
handle=open("c:\\ucdos\\fnt\\hzk24s",O_RDONLY|O_BINARY);
if(c=='h')
handle=open("c:\\ucdos\\fnt\\hzk24h",O_RDONLY|O_BINARY);
if(c=='o')
handle=open("c:\\ucdos\\hzk16",O_RDONLY|O_BINARY);
while((i=*p++)!=0)
{
if(i>0xa0)
{
if(f==0)
{
c1=(i-0xa0)&0x07f;
f=1;
}
else
{
c2=(i-0xa0)&0x07f;
f=0;
if(c=='o')
{rec=c1*94+c2-95;l=rec*32l;w1=16;w2=2;}
else
{rec=c1*94+c2-1505;l=rec*72l;w1=24,w2=3;}
lseek(handle,l,SEEK_SET);
read(handle,by,w1*w2);
for(i1=0;i1<w1;i1++)
for(i2=0;i2<w2;i2++)
for(i3=0;i3<8;i3++)
if(getbit(by[i1*w2+i2],7-i3))
if(w2==2)
putpixel(x+i2*8+i3,y+i1,color);
else
putpixel(x+i1,y+i2*8+i3,color);
x=x+w1+w;
}
}
}
close(handle);
return(x);
}

int getbit(unsigned char c,int n)
{
return((c>>n)&1);
}
  • 打赏
  • 举报
回复
好像UCDOS还是SPDOS忘了(还是两者),24点阵的汉字区和符号区分开保存的,汉字库保存的是从 b0a1(啊) 开始的汉字,符号库保存的是 标点、符号、全角字符等,而16点阵是把所有符号和汉字保存到一个文件里了。
24点阵的汉字点阵排列顺序和16点阵还不一样,24点阵的点是竖排的,16点阵的点是横排的
找一找有没有符号库???
如果我没记错是 符号:hzk24t,宋体:hzk24s,仿宋:hzk24f,……,
其中 hzk24t 是所有字体公共的符号库
汉字个数(hzk24t) + 汉字个数(hzk24s) = 汉字个数(hzk16)
满桌烟灰 2000-07-24
  • 打赏
  • 举报
回复
到DOS版去查,有源程序。
Eie 2000-07-23
  • 打赏
  • 举报
回复
我觉得不是算法处错,而是数据类型转换错(int --> long)
将汉字内码存于p[2]中,
unsigned char p[2];
unsigned long dot;
unsigned long off;
off=((p[0]-0xa1)*94L+(p[1]-0xa1))*dot;

dot 根据点阵数确定:
12*12 dot=24=(12*16/2)
16*16 dot=32=(16*16/8)
24*24 dot=72=(24*24/8)
......
rainbow 2000-07-22
  • 打赏
  • 举报
回复
whq说得对,应改为(94*(((aa-0xa1)&0x07f)-15)+(ff-0xa1)&0x07f)*72L
WHQ 2000-07-20
  • 打赏
  • 举报
回复
有些字库没有前15区的汉字(实际上是各种符号),你碰到这种情况时就重算一下偏移值就行了

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧