Delphi中建立指定大小字体和读取该字体点阵信息的函数

原创 2001年10月25日 17:06:00

 

Delphi中建立指定大小字体和读取该字体点阵信息的函数

作者:Thermometer
Email:  webmaster@daheng-image.com

  由于要控制硬件,需要把矢量的汉字转化为点阵信息写入eprom或在液晶屏上显示,因此用Delphi写了如下的函数,可以把指定的一个汉字(两个字符)转化为点阵信息保存到文件,每个点对应一个二进制位,有文字信息该位为1,否则为0。

  目前该函数可以生成指定大小的汉字并可读取点阵字模信息保存到文件。

  如ConvertToMatrix(Pchar('北'),6,18,'Font.dat')将生成12*18点阵文件Font.dat,其中保存汉字‘北’的字模信息。文件格式是从上到下,先行后列,如下图,第一行保存为00 00,第二行是90 00 (均是16进制,余下个行类推)

 

//转化一个汉字为点阵信息。参数Text为一个汉字,ChrWidth是字符宽,汉字是两个字符大小,所以如果要生成宽是12的汉字则ChrWidth为6,ChrWidth目前最多是8,因为大多数的硬件使用的点阵信息是16以下ChrHeight是汉字的高,SaveFileName是保存该汉字点阵信息的文件名。
function ConvertToMatrix(Text:PChar;
  ChrWidth,ChrHeight:Byte; SaveFileName:Pchar):Bool;
type
   PBITMAPINFO=^TBitmapInfo;
var
  TempBmp:TBitmap;
  lpvSBits,lpvDBits:Pchar;
  dOffset,sOffset:integer;
  DC:HDC;
  TheFont: HFont;

  BMIInfo:PBITMAPINFO;
  DS: TDIBSection;
  BMIbuf:array[0..2047]of byte;

  i,j:integer;//循环控制

  wData:WORD;//保存字体每行的点阵信息,最多16位,不足16位忽略多余的高位

  MemoryStream:TMemoryStream;

begin
  //大于一个字退出
  if Length(Text)>2 then
  begin
    ShowMessage('请转化一个汉字!');
    Result:=False;
    Exit;
  end;
  //参数合理否
  if (ChrWidth=0) or (ChrHeight=0) or (SaveFileName = '') then
  begin
    ShowMessage('参数错误!');
    Result:=False;
    Exit;
  end;
  //建立流
  MemoryStream:=TMemoryStream.Create;
  //建立临时文件
  TempBmp:=TBitmap.Create;
  //设定为256色
  TempBmp.PixelFormat:= pf8bit;
  //设定图宽度
  TempBmp.Width:=ChrWidth * Length(Text);
  //设定图高度
  TempBmp.Height:= ChrHeight;
  //得到BMP文件HDC
  DC:=TempBmp.Canvas.Handle;
  //建立逻辑字体
  TheFont := CreateFont(ChrHeight,ChrWidth, 0, 0, 400, 0, 0, 0,
    GB2312_CHARSET, Out_Default_Precis, Clip_Default_Precis,
    Default_Quality, Default_Pitch OR FF_SCRIPT, 'script');
  //指定字体给DC
  SelectObject(DC,TheFont);
  //写入指定字符串
  TextOut(DC,0,0,Pchar(Text),Length(Text));
  //释放逻辑字体
  DeleteObject(TheFont);

  //取得Bmp信息到lpvSBits
  BMIInfo:=PBITMAPINFO(@BMIbuf);
  //分配内存
  lpvSBits:=AllocMem(TempBmp.Width*TempBmp.Height);
  lpvDBits:=AllocMem(TempBmp.Width*TempBmp.Height);
  //建立程序屏幕兼容的DC
  DC := CreateCompatibleDC(0);
  //返回指定的BMP信息到DS中保存
  GetObject(TempBmp.Handle, SizeOf(DS), @DS);
  //读取头信息
  BMIInfo.bmiHeader:=ds.dsBmih;
  //读入DIB
  GetDIBits(DC, TempBmp.Handle, 0, ds.dsBmih.biHeight,lpvSBits,
    BMIInfo^ , DIB_RGB_COLORS);
  //倒置图像
  for i:=0 to TempBmp.Height-1 do
  begin
    sOffset:=i*TempBmp.Width;
    dOffset:=(TempBmp.Height-i-1)*TempBmp.Width;
    CopyMemory(lpvDBits+dOffset,lpvSBits+sOffset,TempBmp.Width);
  end;
  //保存文件
  for i:=0 to TempBmp.Height-1 do
  begin
    wData:=0;
    for j:=0 to TempBmp.Width-1 do
    begin
      //ShowMessage(inttostr(ord((lpvDBits+i*TempBmp.Width+j)^)));
      if ord((lpvDBits+i*TempBmp.Width+j)^)=0 then
      begin
        wData:=(wData shl 1)OR 1;
      end
      else
      begin
        wData:=(wData shl 1)OR 0;
      end;
    end;
    MemoryStream.Write(wData,SizeOf(wData));
  end;

  MemoryStream.SaveToFile(SaveFileName);
  MemoryStream.Free;
//TempBmp.SaveToFile('temp.bmp')可删除,存'temp.bmp'文件的目的只是为对比察看
  TempBmp.SaveToFile('temp.bmp'); 
  TempBmp.Free;
  FreeMem(lpvSBits);
  FreeMem(lpvDBits);
  result:=True;

end;

附:本文全部为原创内容,如果您使用中对程序做了改动请发给作者一分webmaster@daheng-image.com;引用时请注明原创作者是Thermometer并写清楚原创者的eMail,谢谢。

字体大小,行高,高度

ie6下,font-size  等于 line-height 时,字体受行高限制,显示不全。 如图: 所以应该讲行高值设置为大于字体值2px;...
  • u010119868
  • u010119868
  • 2014年02月08日 10:40
  • 3213

Delphi源码 获取任意字体文本点阵

  • 2010年03月31日 21:24
  • 234KB
  • 下载

delphi XE10实现自定义字体

  • 2016年03月16日 21:26
  • 2.29MB
  • 下载

Delphi 字体修改一例

前言 汉化人大宇在汉化CTris2000这个Delphi 程序的时候,修改了所有RCData中的字体设置,但仍然有一个窗体的字体很...
  • zenghuaunix001
  • zenghuaunix001
  • 2006年05月19日 01:06
  • 639

Delphi中建立指定大小字体和读取该字体点阵信息的函数

 Delphi中建立指定大小字体和读取该字体点阵信息的函数作者:ThermometerEmail:  webmaster@daheng-image.com  由于要控制硬件,需要把矢量的汉字转化为点阵...
  • thermometer
  • thermometer
  • 2001年10月25日 17:06
  • 1551

delphi简单的字体、颜色设置、打开文件、保存等功能的简单实现完整源代码

  • 2011年02月14日 13:39
  • 175KB
  • 下载

[TTF字体]获取TTF字体的点阵信息

获取TTF字体的点阵信息还是使用GetGlyphOutline 看代码 CClientDC dc(this); HDC hDC = dc.GetSafeHdc(); //创建字体 CF...
  • cay22
  • cay22
  • 2013年09月25日 15:19
  • 3061

ttf字体取点阵字模

ttf是矢量字体,freetype2可以解析并操作ttf格式字体,利用它可实现ttf字体提取点阵字模c源代码文件及头文件。软件界面如下: 字框为假象字符边框尺寸,字符尺寸为实际字符尺寸,通常一致即可,...
  • zxr1521904712
  • zxr1521904712
  • 2016年10月25日 10:21
  • 1174

Graphics.MeasureString用指定的字体绘制时测量指定的字符串

Graphics的MeasureString方法,只要指定了字体和字符串后,用这个方法就能获得一个矩形的区域,这个区域是Graphics对象用DrawString方法在空间表面绘制字符串时所要的区域。...
  • thanklife
  • thanklife
  • 2017年06月23日 11:28
  • 331

Qt 设置全局字体

QFont
  • tony2278
  • tony2278
  • 2017年09月29日 10:26
  • 129
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi中建立指定大小字体和读取该字体点阵信息的函数
举报原因:
原因补充:

(最多只允许输入30个字)