Delphi中建立指定大小字体和读取该字体点阵信息的函数(转)
源: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中建立指定大小字体和读取该字体点阵信息的函数(转)的更多相关文章
- 2016-08-15:从YUV420P中提取指定大小区域
typedef struct { int width; int height; }SizeInfo; typedef struct { int x; int y; int width; int hei ...
- delphi中计算指定日期是该月第几周的函数
NthDayOfWeek 计算并返回指定日期是该月第几周 Unit:DateUtils function NthDayOfWeek(const AValue: TDateTime): Word; ...
- linux脚本学习之路-在suse10环境中生存指定大小指定文件名的压缩文件
#!/bin/bash#-------------------------------------------------------------------------------# Name: ...
- Delphi 中关闭指定进程的方法
Uses Windows, SysUtils, Tlhelp32 ; Function KillTask( ExeFileName: String ): Integer ; //关闭进程 Functi ...
- [转]Delphi 中动态链接库(dll)的建立和使用
动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源.由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可 ...
- delphi中locate方法
TDataSet控件以及它的继承控件,例如TSimpleDataSet/TClientDataSet等都可以使用Locate方法在结果数据集中查寻数据.程序首先必须使用SQL命令从后端数据库中取得数据 ...
- Delphi 中的全局快捷键+给指定窗体发送按键
[背景] 公司做视频影像采集,平时采集图像的时候都需要打开采集窗口,然后需要开着采集窗口来进行图像采集.同事问我能不能做一个全局快捷键,哪怕我没有操作也可以采集图像.说干就干,一直想做全局快捷键了,网 ...
- Delphi中的动态包,有详细建立包的步骤(答案很简单:因为包的功能强大)
为什么要使用包? 答案很简单:因为包的功能强大.设计期包(design-time package)简化了自定义组件的发布和安装:而运行期包(run-time package)则更是给传统的程序设计注入 ...
- (转载)读取xml中的指定节点的值
/// <summary> /// 读取xml中的指定节点的值 /// </summary> private st ...
随机推荐
- 使用WMware新建linux虚拟机
使用WMware安装linux虚拟机的时候很多人搞不清楚使用什么适配器. 平时也看到很多误人子弟的观点,这里用事实说话. VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络 ...
- perl面向对象
来源: http://www.cnblogs.com/itech/archive/2012/08/21/2649580.html Perl面向对象 首先让我们来看看有关 Perl 面向对象编程 ...
- ip地址的网络配置
记录一下linux下的网络配置 3.执行命令(通过ifconfig查一下网卡): vi /etc/sysconfig/network-scripts/ifcfg-eth2 注:按字母a,代表插入. 编 ...
- meta标签使360浏览器默认极速模式
在head标签中添加一行代码: <html> <head> <meta name=”renderer” content=”webkit|ie-comp|ie-stand” ...
- jquery 功能强大的下拉菜单
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org ...
- OC 消息机制本质
转载自:http://m.blog.csdn.net/blog/util_c/10287909 在Objective-C中,message与方法的真正实现是在执行阶段绑定的,而非编译阶段.编译器会将消 ...
- 拖拽加点ui吧
有一段时间没写东西了,真的是静下心来不容易的事情. 把之前的代码再翻看下,想想要加点ui什么的. 2d 塔防ui之前 我看过,但放到3d上做,其实难度是很大的. 不过,这不算什么,关键是 合理的 布 ...
- AngularJS继续中
<html ng-app>//全局中引用对应于PhoneListCtrl 模板 <head> <script src="js/angular.js"& ...
- Leetcode389
Find the Difference Given two strings s and t which consist of only lowercase letters. 给出两个字符串,s和t,都 ...
- Centos6.5安装与配置Tomcat-8的方法
环境要求: 系统: [root@Wulaoer ~]# cat /proc/version Linux version 2.6.32-431.el6.x86_64 (mockbuild@c6b8.bs ...