如何将16点阵字库输出到 BitMap 上?(100分)

  • 主题发起人 主题发起人 tianhf
  • 开始时间 开始时间
这是dos下读取ucdos的kzk16的c程序,估计你要字库的结构。

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
void showhz(FILE *fp,unsigned char *OneHz);
void main()
{
FILE *fp;
int gdriver = DETECT, gmode;

/* initialize graphics mode */
initgraph(&amp;gdriver, &amp;gmode, "c://tc//bgi");

fp=fopen("hzk16","rb");
showhz(fp,"我");
getch();
closegraph();
}

void showhz(FILE *fp,unsigned char *OneHz)
{
long offset=32l*((OneHz[0]-0xa1)*94+OneHz[1]-0xa1);
unsigned char dotarray[32];
int x,y,i,j,k,l;
unsigned char bitarray[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
fseek(fp,offset,0);
for (i=0;i<32;i++)
{
dotarray=fgetc(fp);
}
for (j=0;j<16;j++)
for(k=0;k<2;k++)
for (l=0;l<8;l++)
{
x=k*8+l;
y=j;
if (dotarray[j*2+k]&amp;bitarray[l])
putpixel(x,y,RED);
else
putpixel(x,y,BLACK);
}
}
 
g622兄误会了我的意思了!
在 dos 中,图形方式下直接向 A000段写入一个整数(16位),可以一下输出16个点,完全不用 putpixel 函数,这样速度快很多,我希望通过向 bitMap 的DC句柄(或其它属性) 写整数(16位),达到DOS效果,这一定可以办到!
 
但那是单色的才这样啊
 
的确是单色!
 
procedure TMainFrm.ReadChinese(S:String);
var
Bmp:TBitmap;
Fp:File of Byte;
i,j,k,p:Integer;
Value,Ch:Byte;
Ptr:PByteArray;
begin
AssignFile(Fp,'d:/ucdos/hzk16');
{$I-} Reset(Fp); {$I+}
if IOResult<>0 then begin
Application.MessageBox('打开字体文件失败!',
PChar(Caption),MB_ICONERROR);
Application.Terminate;
end;
try
Seek(Fp,((Ord(S[1])-161)*94+(Ord(S[2])-161))*32);
Bmp:=TBitmap.Create;
try
Bmp.Width:=16;
Bmp.Height:=16;
Bmp.PixelFormat:=pf24Bit;
for i:=0 to 15 do begin
Ptr:=Bmp.ScanLine; p:=0;
for j:=0 to 1 do begin
Read(Fp,Ch);
for k:=0 to 7 do begin
if Byte(Ch shl k) shr 7=1 then Value:=0
else Value:=255;
Ptr[p]:=Value;
Ptr[p+1]:=Value;
Ptr[p+2]:=Value;
Inc(p,3);
end;
end;
end;
Image.Canvas.Draw(0,0,Bmp);
finally
Bmp.Free;
end;
finally
CloseFile(Fp);
end;
end;

procedure TMainFrm.FormCreate(Sender: TObject);
begin
ReadChinese('我');
end;
 
JohnsonGuo兄的方法的确能输出汉字,可否能象我上面说的那样不用位操作直接输出16Bit(单色也可以)
 
我对原程序修改了一下,现在不用进行位操作了。

procedure TMainFrm.ReadChinese(S:String);
var
Bmp:TBitmap;
Fp:File of Byte;
i:Integer;
Ch1,Ch2:Byte;
Ptr:PByteArray;
begin
AssignFile(Fp,'d:/chfont/hzk16');
{$I-} Reset(Fp); {$I+}
if IOResult<>0 then begin
Application.MessageBox('打开字体文件失败!',
PChar(Caption),MB_ICONERROR);
Application.Terminate;
end;
try
Seek(Fp,((Ord(S[1])-161)*94+(Ord(S[2])-161))*32);
Bmp:=TBitmap.Create;
try
Bmp.Width:=16;
Bmp.Height:=16;
Bmp.PixelFormat:=pf1Bit;
for i:=0 to 15 do begin
Read(Fp,Ch1,Ch2);
Ptr:=Bmp.ScanLine;
Ptr[0]:=not Ch1;
Ptr[1]:=not Ch2;
end;
Image.Canvas.Draw(0,0,Bmp);
finally
Bmp.Free;
end;
finally
CloseFile(Fp);
end;
end;

procedure TMainFrm.FormCreate(Sender: TObject);
begin
ReadChinese('我');
end;
 
有病吧? windows自己的字体不用?
 
回cAkk:
其实我不想输出汉字,有一个文件有图形点阵(黑白),我想显示它,有JohnsonGuo 的实例我就能实现了!
谢谢 JohnsonGuo,g622 及其他几位!
 
后退
顶部