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

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[..]of byte; i,j:integer;//循环控制 wData:WORD;//保存字体每行的点阵信息,最多16位,不足16位忽略多余的高位 MemoryStream:TMemoryStream; begin
//大于一个字退出
if Length(Text)> then
begin
ShowMessage('请转化一个汉字!');
Result:=False;
Exit;
end;
//参数合理否
if (ChrWidth=) or (ChrHeight=) 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, , , , , , ,
GB2312_CHARSET, Out_Default_Precis, Clip_Default_Precis,
Default_Quality, Default_Pitch OR FF_SCRIPT, 'script');
//指定字体给DC
SelectObject(DC,TheFont);
//写入指定字符串
TextOut(DC,,,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();
//返回指定的BMP信息到DS中保存
GetObject(TempBmp.Handle, SizeOf(DS), @DS);
//读取头信息
BMIInfo.bmiHeader:=ds.dsBmih;
//读入DIB
GetDIBits(DC, TempBmp.Handle, , ds.dsBmih.biHeight,lpvSBits,
BMIInfo^ , DIB_RGB_COLORS);
//倒置图像
for i:= to TempBmp.Height- do
begin
sOffset:=i*TempBmp.Width;
dOffset:=(TempBmp.Height-i-)*TempBmp.Width;
CopyMemory(lpvDBits+dOffset,lpvSBits+sOffset,TempBmp.Width);
end;
//保存文件
for i:= to TempBmp.Height- do
begin
wData:=;
for j:= to TempBmp.Width- do
begin
//ShowMessage(inttostr(ord((lpvDBits+i*TempBmp.Width+j)^)));
if ord((lpvDBits+i*TempBmp.Width+j)^)= then
begin
wData:=(wData shl )OR ;
end
else
begin
wData:=(wData shl )OR ;
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,谢谢。

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

  1. 2016-08-15:从YUV420P中提取指定大小区域

    typedef struct { int width; int height; }SizeInfo; typedef struct { int x; int y; int width; int hei ...

  2. delphi中计算指定日期是该月第几周的函数

      NthDayOfWeek 计算并返回指定日期是该月第几周 Unit:DateUtils function NthDayOfWeek(const AValue: TDateTime): Word; ...

  3. linux脚本学习之路-在suse10环境中生存指定大小指定文件名的压缩文件

    #!/bin/bash#-------------------------------------------------------------------------------# Name:   ...

  4. Delphi 中关闭指定进程的方法

    Uses Windows, SysUtils, Tlhelp32 ; Function KillTask( ExeFileName: String ): Integer ; //关闭进程 Functi ...

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

    动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源.由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可 ...

  6. delphi中locate方法

    TDataSet控件以及它的继承控件,例如TSimpleDataSet/TClientDataSet等都可以使用Locate方法在结果数据集中查寻数据.程序首先必须使用SQL命令从后端数据库中取得数据 ...

  7. Delphi 中的全局快捷键+给指定窗体发送按键

    [背景] 公司做视频影像采集,平时采集图像的时候都需要打开采集窗口,然后需要开着采集窗口来进行图像采集.同事问我能不能做一个全局快捷键,哪怕我没有操作也可以采集图像.说干就干,一直想做全局快捷键了,网 ...

  8. Delphi中的动态包,有详细建立包的步骤(答案很简单:因为包的功能强大)

    为什么要使用包? 答案很简单:因为包的功能强大.设计期包(design-time package)简化了自定义组件的发布和安装:而运行期包(run-time package)则更是给传统的程序设计注入 ...

  9. (转载)读取xml中的指定节点的值

            /// <summary>         /// 读取xml中的指定节点的值        /// </summary>         private st ...

随机推荐

  1. wpf 类似TextBlock外观的Button的样式

    <Style x:Key="noborderbtnStyle" TargetType="{x:Type Button}"> <Setter P ...

  2. 转载,find.sh

    #!/bin/bash #find files contains a keyword #write by xiaojing.zhao #2012.12.14 echo -e "\nThis ...

  3. RS485 介绍

    一.RS485总线介绍: RS485总线是一种常见的串行总线标准,采用平衡发送与差分接收的方式,因此具有抑制共模干扰的能力.在一些要求通信距离为几十米到上千米的时候,RS485总线是一种应用最为广泛的 ...

  4. php杂乱

    //    //    if ( $_GET['action'] == 'search' ) {//        $_clean = array();//        $_clean['stype ...

  5. FTP: Configuring server users..

    4 points to create a user to uploade to ftproot.. this user must be an administrator, and be able to ...

  6. jsp ${param.id}用法

    它的取值范围Page,Request,Session,Application. ${param.id} 与输入有关,相对于 request.getParameter("id").意 ...

  7. centos yum源问题

    在配置CentOS-6.0-x86_64-bin-DVD2.iso作为本地yum源的时候,碰到相当多的问题: -----------------------------------------  问题 ...

  8. U3D脚本开发基础

    1.MonoBehaviour类,定义了对各种特定事件的脚本响应函数.这些函数均以On做开头. 2.U3D中常用的组件及对应变量名如下: Transform(transform),Rigidbody( ...

  9. Zencart批量删除无图片产品

    Zencart批量删除无图片产品 2012-04-23 07:26:18|  分类: 默认分类 |字号 订阅 转自 http://zhongjia33.blog.163.com/blog/#m=0   ...

  10. js中的整型都是用double存储的,有时候不精确,如,

    sss=187948800449444864 187948800449444860   好像16位的时候还可以. http://segmentfault.com/a/1190000002608050