我提取字体的点阵信息,用什么函数啊?
比如16×16,或者12×12的点阵,谢谢! 问题点数:50、回复次数:11Top
1 楼Behard(我爱天安门)回复于 2005-12-09 11:09:21 得分 5
找现成的字库,可以找 UCDOS 的,或者 Linux 的一些控制台下图形显示字库Top
2 楼xiayu98020214(duet)回复于 2005-12-09 12:55:21 得分 0
我要提取多国语言的字库,不如日文,德文Top
3 楼h2plus0(~~~)回复于 2005-12-09 14:55:40 得分 20
请参考 GetGlyphOutlineW
不过我也不是很清楚的说
Top
4 楼xiayu98020214(duet)回复于 2005-12-09 15:27:09 得分 0
给个例子吧Top
5 楼netsys2(来电!)回复于 2005-12-09 17:13:07 得分 10
这是jishiping同志给我的帮助:
: ◆ 怎样提取汉字的点阵值 ◆ 一个32*32的汉字,怎样编程获取它点阵值? 以0表示空白,1表示有点,以HEX形式存储。
主要解答者: jishiping 提交人: netsys2
感谢: hdaq
审核者: Aweay 社区对应贴子: 查看
A :
Graphics::TBitmap* Bmp;
Bmp = new Graphics::TBitmap;
Bmp->Monochrome = true; //黑白2色图形
Bmp->Width = 32; Bmp->Height = 32;
Bmp->Canvas->Font->Name = "宋体";
Bmp->Canvas->Font->Charset = GB2312_CHARSET;
Bmp->Canvas->Font->Height = -32;
Bmp->Canvas->Brush->Color = clBlack; //之前这儿前面少了Bmp->
Bmp->Canvas->Rectangle(0, 0, 32, 32); //用黑色填充图形
Bmp->Canvas->Font->Color = clWhite; //字的颜色为白色
Bmp->Canvas->TextOut(0, 0, "字"); //在图形上输出“字”,这样就
//得到了“字”的 32*32 的点阵
//下面的方法判断32×32点阵的每个点的颜色
for(int y=0; y<32; y++) {
BYTE bMask = 0x80; //之前这儿多了一个*
BYTE* pData = (BYTE*)Bmp->ScanLine[y];
for(int x=0; x<32; x++,bMask>>=1) {
if (bMask == 0) {
bMask = 0x80; pData++;
}
if (*pData & bMask)
; //点阵的 (x,y) 颜色为白色
else
; //点阵的 (x,y) 颜色为黑色
}
}
delete Bmp;Top
6 楼MEFULEU(没有作不到,只有想不到)回复于 2005-12-09 17:44:54 得分 5
如果是ocr的话是否就是使用字体的点阵对照呢?
这样子速度是否很慢????Top
7 楼xili()回复于 2005-12-09 18:23:06 得分 5
ocr用点阵对照? 不是吧.
手写体怎么对照呀.Top
8 楼houbing_0123(冰河々C++ Builder々)回复于 2005-12-12 15:21:06 得分 5
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MainFont.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
try
{
//以只读方式打开字库文件,并将数据读到缓冲区中。
iFileHandle = FileOpen("hzk16", fmOpenRead);
iFileLength = FileSeek(iFileHandle,0,2);
FileSeek(iFileHandle,0,0);
pszBuffer = new char[iFileLength+1];
iBytesRead = FileRead(iFileHandle, pszBuffer, iFileLength);
OKButton->Enabled=true;
ForwardButton->Enabled=true;
NextButton->Enabled=true;
}
catch(...)
{
Application->MessageBox("打开文件错误", "错误信息", IDOK);
}
dptr=0;//设置冲区起始指针
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormDestroy(TObject *Sender)
{
delete [] pszBuffer;
FileClose(iFileHandle);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::NextButtonClick(TObject *Sender)
{
PaintFont();
}
void __fastcall TMainForm::ForwardButtonClick(TObject *Sender)
{
if(dptr>=64)
{
dptr=dptr-64;
PaintFont();
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::DrawRect()
{
int width=320;
int height=320;
PaintBox1->Canvas->Brush->Color=clBlack;
PaintBox1->Canvas->FillRect(Rect(0,0,PaintBox1->Width,PaintBox1->Height));
PaintBox1->Canvas->Pen->Color = clYellow;
for(int i=0;i<17;i++)
{
PaintBox1->Canvas->MoveTo(1,i*20);
PaintBox1->Canvas->LineTo(width,i*20);
PaintBox1->Canvas->MoveTo(i*20,1);
PaintBox1->Canvas->LineTo(i*20,height);
}
}
void __fastcall TMainForm::PaintBox1Paint(TObject *Sender)
{
DrawRect();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::PaintFont()
{
PaintBox2->Canvas->Brush->Color=clBlack;
PaintBox2->Canvas->FillRect(Rect(0,0,PaintBox2->Width,PaintBox2->Height));
PaintBox1->Canvas->Brush->Color=clBlack;
PaintBox1->Canvas->FillRect(Rect(0,0,PaintBox1->Width,PaintBox1->Height));
DrawRect();
POINT point;
point.x=0;point.y=0;
int i,j;
char ch,ch1;
PaintBox1->Canvas->Brush->Color=clBlue;
for(i=0;i<16;i++)
{
for(j=0;j<2;j++)
{
ch=*(pszBuffer+dptr); dptr++;
ch1=ch;ch>>=7;ch&=0x1;
if(ch==1)
{
PaintBox2->Canvas->Pixels[point.x][point.y] = clRed;
PaintBox1->Canvas->FillRect(Rect(point.x*20+1,
point.y*20+1,point.x*20+19,point.y*20+19));
}
point.x++;
ch=ch1;ch>>=6;ch&=0x1;
if(ch==1)
{
PaintBox2->Canvas->Pixels[point.x][point.y] = clRed;
PaintBox1->Canvas->FillRect(Rect(point.x*20+1,
point.y*20+1,point.x*20+19,point.y*20+19));
}
point.x++;
ch=ch1;ch>>=5;ch&=0x1;
if(ch==1)
{
PaintBox2->Canvas->Pixels[point.x][point.y] = clRed;
PaintBox1->Canvas->FillRect(Rect(point.x*20+1,
point.y*20+1,point.x*20+19,point.y*20+19));
}
point.x++;
ch=ch1;ch>>=4;ch&=0x1;
if(ch==1)
{
PaintBox2->Canvas->Pixels[point.x][point.y] = clRed;
PaintBox1->Canvas->FillRect(Rect(point.x*20+1,
point.y*20+1,point.x*20+19,point.y*20+19));
}
point.x++;
ch=ch1;ch>>=3;ch&=0x1;
if(ch==1)
{
PaintBox2->Canvas->Pixels[point.x][point.y] = clRed;
PaintBox1->Canvas->FillRect(Rect(point.x*20+1,
point.y*20+1,point.x*20+19,point.y*20+19));
}
point.x++;
ch=ch1;ch>>=2;ch&=0x1;
if(ch==1)
{
PaintBox2->Canvas->Pixels[point.x][point.y] = clRed;
PaintBox1->Canvas->FillRect(Rect(point.x*20+1,
point.y*20+1,point.x*20+19,point.y*20+19));
}
point.x++;
ch=ch1;ch>>=1;ch&=0x1;
if(ch==1)
{
PaintBox2->Canvas->Pixels[point.x][point.y] = clRed;
PaintBox1->Canvas->FillRect(Rect(point.x*20+1,
point.y*20+1,point.x*20+19,point.y*20+19));
}
point.x++;
ch=ch1;ch&=0x1;
if(ch==1)
{
PaintBox2->Canvas->Pixels[point.x][point.y] = clRed;
PaintBox1->Canvas->FillRect(Rect(point.x*20+1,
point.y*20+1,point.x*20+19,point.y*20+19));
}
point.x++;
}
point.y++;
point.x=0;
}
}
//---------------------------------------------------------------------------
int __fastcall TMainForm::GetWordPtr(int x1,int x2)
{
int size;
if((x1&0x80)!=0)
{
x1=x1&0x7f; //内码转换为区位码
x2=x2&0x7f;
x1=x1-0x20;
x2=x2-0x20;
size=((x1-1)*94+(x2-1))*32;
//16点阵汉字:
// 偏移量=((区号-1)*94+(位号-1))*32
// 或:偏移量=((机内码高8位-0xA1)*94+(机内码低8位-0xA1))*32
//24点阵汉字:
//前16区: 偏移量=((区号-1)*94+(位号-1))*72
//后16区: 偏移量=((区号-17)*94+(位号-1))*72
}
else
{
size=(188+x1-33)*32; //为字符时
}
/////////////////////////////////
return size;
}
void __fastcall TMainForm::OKButtonClick(TObject *Sender)
{
AnsiString cs;
cs=Edit1->Text;
char cs1[2];
wsprintf(cs1,cs.c_str());
dptr=GetWordPtr(cs1[0],cs1[1]);
PaintFont();
}
//---------------------------------------------------------------------------
Top
9 楼xiayu98020214(duet)回复于 2005-12-12 17:12:07 得分 0
怎样生成高16,宽14的字体啊,再次感谢!!!Top
10 楼xiayu98020214(duet)回复于 2005-12-12 17:14:15 得分 0
也就是可以任意调整字体的高和宽Top
11 楼xiayu98020214(duet)回复于 2005-12-15 09:16:12 得分 0
gmptGlyphOrigin.y的坐标原点是哪里呀,按照msdn上说是左上角,但我觉得不对呀?Top




