源: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. Hibernate4 占位符(?)

    Hibernate3使用?占位符: Session session = sessionFactory.getCurrentSession();  session.beginTransaction(); ...

  2. 利用npoi把多个DataTable导入Excel多个sheet中

    { 题外拓展:把datatable插入dataset DataTable fuben = new DataTable();//定义的datatablefuben = table.Tables[0].C ...

  3. white-space详解

    white-space共有5种属性normal,nowrap,pre,pre-wrap,pre-line 网上的解释多半过于详细冗长,先做个简化处理,以便查询 normal    忽略空白  过长换行 ...

  4. 转 linux下xargs命令用法详解

    xargs在linux中是个很有用的命令,它经常和其他命令组合起来使用,非常的灵活. xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤 ...

  5. Android OpenGL ES(十一)绘制一个20面体 .

    前面介绍了OpenGL ES所有能够绘制的基本图形,点,线段和三角形.其它所有复杂的2D或3D图形都是由这些基本图形构成. 本例介绍如何使用三角形构造一个正20面体.一个正20面体,有12个顶点,20 ...

  6. Android OpenGL ES(四)关于EGL .

    OpenGL ES的javax.microedition.khronos.opengles 包定义了平台无关的GL绘图指令,EGL(javax.microedition.khronos.egl ) 则 ...

  7. java 数据结构 图

    以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客,主要是在自己理解的基础上进行记录. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示 ...

  8. Mac机上安装虚拟机

    1.首先要下载虚拟机VMware.网址http://pan.baidu.com/share/init?shareid=1519279671&uk=1434905687,连接该网址,下载里边的这 ...

  9. HDU 4635 Strongly connected(强连通分量缩点+数学思想)

    题意:给出一个图,如果这个图一开始就不是强连通图,求出最多加多少条边使这个图还能保持非强连通图的性质. 思路:不难想到缩点转化为完全图,然后找把它变成非强连通图需要去掉多少条边,但是应该怎么处理呢…… ...

  10. vbs 解析html文档的方法

    vbs 解析html文档的方法(htmlfile) 投稿:mdxy-dxy 字体:[增加 减小] 类型:转载 时间:2014-06-18我要评论 关于VBS采集,网上流行比较多的方法都是正则,其实 h ...