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

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

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

作者:Thermometer Email:  [email protected]

  由于要控制硬件,需要把矢量的汉字转化为点阵信息写入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;

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

时间: 2024-08-02 08:13:35

Delphi中建立指定大小字体和读取该字体点阵信息的函数(转)的相关文章

2015-08-15: 从YUV420P中提取指定大小区域

typedef struct { int width; int height; }SizeInfo; typedef struct { int x; int y; int width; int height; }ImageRect; /************************************************* // Method : ExtraceSpecifiedSizeYuv // Author : zhoulee // Date : 2016/08/15 16:14

pandas中没有指定字段名,读取相应字段时的数据类型

#这里的结果返回最小日期,最大日期,但是没有指定列名,所以后面的书写形式返回的结果也不一样 grouped=df.groupby(by=['userid']).orderdate.agg(['min','max']) a=type(grouped['min']==grouped['max']) b=type(grouped.min==grouped.max) c=type(grouped.min) print("a的数据类型为:",a) print("b的数据类型为:&quo

[转]Delphi 中动态链接库(dll)的建立和使用

动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源.由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可以实现一些一般程序所不能实现的功能,如实现windows的HOOK.ISAPI等.同时,DLL还为不同语言间代码共享提供了一条方便的途径.因而DLL在编程时应用较为广泛,本文将介绍如何在 Delphi 中建立和使用DLL. 一.DLL 库内存共享机制 从使用效果看,DLL和unit 很像,它们都可以

Delphi中的消息处理

1.windows的消息驱动体系  在windows系统中,消息传递是实现对乡间通信和控制的主要手段.可以额系统都以消息驱动的方式工作.系统中发生的用户输入操作.显示信息的改变.系统环境参数变化等所有时间都以系统定义消息的形式出现在相关的应用程序和窗口.所以程序设计的主要任务就是为这些消息的处理设计代码. 在应用程序中,发送者可以通过发送消息要求接收者完成相应的处理.当程序运行时,windows系统为每个应用程序实例建立一个消息队列,一次保存发送给该程序实例的消息,在应用程序的主控部分,需要设置

delphi中locate方法

TDataSet控件以及它的继承控件,例如TSimpleDataSet/TClientDataSet等都可以使用Locate方法在结果数据集中查寻数据.程序首先必须使用SQL命令从后端数据库中取得数据并且形成结果数据集,然后才使用Locate方法查寻数据. 当使用Locate方法查寻数据时,开发人员可以使用任何的字段条件来查寻,而无须理会这个字段是不是索引字段.当然,当开发人员使用索引字段来查寻数据时,Locate会直接使用索引来帮助查寻,因此速度会非常快速.如果开发人员使用非索引字段查寻数据,

在Delphi开发的服务中调用指定应用程序

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://fxh7622.blog.51cto.com/63841/529033 在很多时候,我们需要使用服务启动指定的应用程序来做到隐蔽启动程序的目的. 但是当我们直接使用Winexec来运行的时候,你会发现系统提示出错.以下的代码就是如何在Delphi编写的服务中启动指定的应用程序. function RunProcess(const ProcessName: String): Boo

Delphi中使用python脚本读取Excel数据

Delphi中使用python脚本读取Excel数据2007-10-18 17:28:22标签:Delphi Excel python原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://seewind.blog.51cto.com/249547/46669前段时间,在正式项目中使用Python来读取Excel表格的数据.具体需求是,项目数据库中有些数据需要根据Excel表格里面的数据进行一些调整,功能应该比较简单.为了学习Pyth

delphi 中DLL的建立

Dll的创建与调用 File ->New->Other->Dll Wizard DLL的创建 //可以将本代码复制粘贴到项目中 library Project1; uses SysUtils, Classes, Windows, Forms; {$R *.res} function Min(x,y:Integer):Integer;stdcall; begin if (x<y) then Result:=x else Result:=y; end; procedure MsgBox

读取xml中的指定节点的值

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 /// <summary>         /// 读取xml中的指定节点的值        /// </summary>         private string ReadXmlNode(string filename)        {            string result = "-1";            XmlDocu