CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

我提取字体的点阵信息,用什么函数啊?

楼主xiayu98020214(duet)2005-12-09 10:37:41 在 C++ Builder / 基础类 提问

比如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

相关问题

  • 点阵字体如何调用?
  • 怎样使用点阵字体?
  • 提取字体问题
  • 改变字体和字体大小用什么函数?
  • 一个提取字符串的函数
  • 急!!!如何从windows提取点阵?
  • VC : 谁用过GetGlyphOutline函数来取过点阵
  • 哪个API函数可以增大/缩小字体?
  • 请问载CRichEditCtrl中修改字体的函数是什么?
  • 大白鲨:函数对话框的字体设置-ShowMessage

关键词

  • 字体
  • 图形
  • paintbox
  • 点阵
  • canvas
  • tmainform
  • point
  • ch
  • bmp
  • ifilehandle

得分解答快速导航

  • 帖主:xiayu98020214
  • Behard
  • h2plus0
  • netsys2
  • MEFULEU
  • xili
  • houbing_0123

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo