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

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

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

时间: 2025-01-21 09:33:31

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

Delphi中获取指定年月的周、日数

WeeksInAYear.WeeksInYear.DaysInAYear.DaysInAMonth.DaysInYear.DaysInMonth - 获取指定年月的周.日数 DateUtils.DaysInYear(); DateUtils.DaysInMonth(); DateUtils.DaysInAYear(); DateUtils.DaysInAMonth(); DateUtils.WeeksInYear(); DateUtils.WeeksInAYear(); unit Unit1;

Delphi中建立交叉表

function CreateTmptab(const AFieldDefs:TFieldDefs):TDataSet; var TempTable:TatClientDataSet; begin TempTable:=nil; Result:=nil; if AFieldDefs<>nil then begin try TempTable:=TatClientDataSet.Create(Application); TempTable.FieldDefs.Assign(AFieldDefs)

Android 按指定大小读取图片的实例_Android

在Android开发中,我们经常遇到Android读取图片大小超过屏幕显示的图(一般只要显示一定规格的预览图即可),在图片特别多或者图片显示很频繁的时候要特别注意这个问题,下面介绍个按指定大小读取图像的方法. 实现原理:首先获取图片文件的图像高和宽,如果小于指定比例,则直接读取:如果超过比例则按指定比例压缩读取. 捕获OutOfMemoryError时注意点:后面返回的是null,不要马上从别的地方再读图片,包括R文件中的,不然依然会抛出这个异常,一般在初始化的时候缓存默认图片,然后显示缓存中的

Android 按指定大小读取图片的实例

在Android开发中,我们经常遇到Android读取图片大小超过屏幕显示的图(一般只要显示一定规格的预览图即可),在图片特别多或者图片显示很频繁的时候要特别注意这个问题,下面介绍个按指定大小读取图像的方法. 实现原理:首先获取图片文件的图像高和宽,如果小于指定比例,则直接读取:如果超过比例则按指定比例压缩读取. 捕获OutOfMemoryError时注意点:后面返回的是null,不要马上从别的地方再读图片,包括R文件中的,不然依然会抛出这个异常,一般在初始化的时候缓存默认图片,然后显示缓存中的

MFC中如何指定位置、大小显示图片

问题描述 MFC中如何指定位置.大小显示图片 如图所示,我想在红色框框内显示人员的照片信息,规定就是按照框框那么大,请问该怎么办呢? ```void CbitMapDlg::OnBnClickedCheckButton(){ // TODO: 在此添加控件通知处理程序代码 CBitmap bitmap; HBITMAP hBmp; bitmap.LoadBitmap(IDB_BITMAP1); hBmp = (HBITMAP)bitmap.GetSafeHandle(); m_Picture.S

java io读取一个txt中带指定关键字的某行。

问题描述 java io读取一个txt中带指定关键字的某行. 楼主大一,Java小白,课程设计遇到的问题,用io流读取txt中的数据,查询时输入身份证号,要求显示出这个身份证号所在的这一行信息,这个要怎么做呢? 解决方案 可以使用BuffferedReader来读取文件,并一行一行的比较,如果该行包含这个身份证号,就返回该行的信息即可.比如你的txt为D:data.txt public static void main(String[] args) { String idNum = ""

Delphi中如何读取dicom的图片格式?代码怎么写?求大神解救

问题描述 Delphi中如何读取dicom的图片格式?代码怎么写?求大神解救

Android的browser源码中,怎么修改标签页的标题字体大小

问题描述 Android的browser源码中,怎么修改标签页的标题字体大小 在做Android系统开发的时候,由于系统要求,字体已经固定.但是发现系统自带的浏览器,标签页标题字体太小的.不知道怎么修改. 看了一下源码,Tag.java的源码中有可以找到标题的变量mTitle,但是不知道如何修改字体的大小,希望大牛指点. // All the state needed for a page protected static class PageState { String mUrl; Strin

在delphi中如何动态建立类的实例

本文为原创,如需转载,请注明作者和出处,谢谢!     在面向对象语言中,用两种方法建立类的实例:静态建立和动态建立.静态建立就是在程序中显式地建立类的实例,如c1 = TClass1.Create().而动态建立是在只知道类名的前题下建立类的实例.动态建立在实现上要比静态建立更灵活,因为动态建立无需引用被建立 类,并且更容易实现如多态等面向对象特性. 一.    动态建立类的实例 在delphi中动态建立类的实例可分为4步. 1. 声明一个从TPersistent继承的类.因为在注册类时要求必