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 ...
随机推荐
- java动态代理(1)
来源:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html# java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代 ...
- wpa_supplicant_8_ti hostapd wpa_supplicant TI 官方的wpa_supplicant hostapd 移植到linux
在移植 wpa_supplicant_8_ti 的时候碰到很多头文件找不到.然后参考了下面的博客 http://blog.csdn.net/penglijiang/article/details/85 ...
- 常见html标签
1.flash嵌入标签 <object> <embed allowscriptaccess="always" allowfullscreen="true ...
- linux 终端相关
echo cd ~/桌面 >> .bashrc 将终端默认路径设为桌面 -/.bashrc./etc/bash.bashrc./etc/profile这几个文件.这些文件的的作用时机:/e ...
- Swift: Alamofire -> http请求 & ObjectMapper -> 解析JSON
1 2 3 4 5 6 7 8 9 10 11 NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.js ...
- RatingBar
题记:保持旺盛的求知欲.希望会一直这样. 说明:来了新控件了.就是经常用的打分的那种东东. 说明:1.看上图分别是系统自带的和自己做的.rating就是设置小星星的数目. 2.用系统自带的必须是Wra ...
- JS的className,字体放大缩小
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- html5 之本地数据存储
HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 cookie与webSt ...
- POJ - 2336 Wireless Network
Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have ...
- CodeForces 678C Joty and Chocolate
简单题. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> ...