如何利用windows自带的矢量字库提取字模
1 字体设置
首先需要设置字体。Win32 SDK提供了用于字体选择的通用对话框,只需调用ChooseFont函数,其返回值为一个布尔值。具体定义为BOOL ChooseFont(LPCHOOSEFONT lpcf)。调用此函数后,弹出字体选择对话框,在此可以选择所需要的字体、字形、大小等参数。选择完毕后,如果点击了字体选择对话框上的确定键,此函数返回一个非零值;若点击的是取消键,则函数返回一个零值。调用此函数前,还要定义二个变量:
CHOOSEFONT cf;
LOGFONT logfont;
CHOOSEFONT是有十多个字段的结构体,包含了ChooseFont函数用来初始化字体选择对话框的各种信息。LOGFONT也是一个结构体,包含14个字段,定义了字体的各种属性。当点击确定键后,系统通过LOGFONT结构返回选定的字体信息。返回的字体信息保存在CHOOSEFONT结构的lpLogFont字段指定的LOGFONT结构中。
下面是调用ChooseFont函数的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
如果ChooseFont(&cf)函数返回非零值,则字体已经选定。选定的字体就保存在logfont变量中。接下来要做的就是创建选定的逻辑字体。可以调用CreateFontIndirect函数创建逻辑字体。CreateFontIndirect函数接受一个指向LOGFONT结构的指针,具体定义为HFONT CreateFontIndirect(CONST LOGFONT?鄢lplf)。代码如下:
HFONT hNewFont=CreateFontIndirect(&logfont);
至此字体创建就完成了。直接调用SeletObject函数就可以将创建的逻辑字体选入设备描述表。在位图转换里将使用SelectObject函数将hNewFont选入内存设备描述表。但还要注意一点,在程序结束前,必须调用DeleteObject(hNewFont)函数来释放字体句柄,避免内存泄漏。下面介绍文本转换为位图的具体实现过程。
2 位图转换
此处以提取一个“婷”字的字模为例进行说明。首先需要定义如下变量:
1 2 3 4 5 6 |
|
cxBitmap、cyBitmap是所要创建的位图的大小,二者与GetTextExtentPoint32函数得到的文本大小一致,在此处即是“婷”字的大小。
以下是将汉字文本转化为位图的具体方法,一般在WM_PAINT消息中处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
至此,汉字的点阵化过程就完成了,接下来就应该提取字模。
3 提取字模
提取字模要用到的是GetPixel函数,定义为COLORREF GetPixel(HDC hdc,int nXPos,int nYPos)。此函数返回一个COLORREF类型的值,即nXPos、nYPos所指定的点的RGB值。位图的大小在前文已经确定,在此范围类将每个象素点扫描一次,根据返回的RGB值生成点阵码。因为Windows矢量字体有灰度等级,所以必须选择合适的RGB值,用来判断此点是否有效。白色的RGB值是FFFFFFH,深灰的是808080H,黑色的是000000H。可以选择深灰做为判断依据,当函数返回值小于808080H时,认为此点有效。下面是提取字模的函数,以字节为存储单位,从第一行第一个点开始扫描:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
在WM_PAINT消息中,调用GetZimo(hdcMem,cxBit-
map,cyBitmap)即可得到汉字的字模。在程序的最后,还必须做些扫尾的工作:
DeleteObject(hBitmap);//使用完后必须释放设备描述
//表和位图句柄,避免内存泄漏
DeleteObject(hNewFont);
DeleteDC(hdcMem);
EndPaint(hwnd,&ps);
Return 0; //WM_PAINT消息处理完后返回
4 输出结果
以“婷”字为例,弹出字体选择对话框后,字体选新宋体、字形选常规、字号选小二。得出Hang=24,Lie=3,存储72个字节。字模为
1 |
|
在纸上画出点阵码,正好是“婷”字,如图1所示。从cxBitmap和cyBitmap可以知道,“婷”字点阵大小是24×24。
如何利用windows自带的矢量字库提取字模相关推荐
- 利用Windows自带服务架设免费邮件服务器
在Windows Server 2003中带有完整的SMTP和POP3服务,并且能够支持有域和无域两种环境,非常便于中小型企业实施.今天,小编就以Windows Server 2003企业版为例带领大 ...
- 利用Windows自带的计算器计算十六进制(八进制、二进制)数据
有时需要对十六进制数做加减乘除,某些手机app能实现此功能,但使用起来未免有些麻烦,其实Windows自带的计算器就可以实现十六进制数的运算. 1.找到并打开计算器 2.点击如图所示的位置 3.点击程 ...
- 利用Windows 自带的任务计划功能设置闹钟
相信很多人都会遇到这样一个麻烦,就是不知道如何在windows 中弄一个闹铃,当我们在开始所有程序.附件等处找了一遍又一遍,时钟没有发现"闹钟"两个字后,大多都会选择放弃,&quo ...
- 无需第三方软件,利用Windows自带的WIN+R实现快速启动软件
阿虚桌面一个快捷方式都没有!因为我有特别的启动方法
- 利用windows自带的工具终止顽固进程
tasklist/svc 用来查看系统打开进程.显示图像名和pid服务号 ntsd-cq-p133440133440为程序的pid号.用来关掉该进程. 注意:tasklist在xp系统中才有
- 单片机 怎调用显示屏字库_单片机巧用Windows矢量字库
1 引 言本文引用地址:http://www.eepw.com.cn/article/172177.htm 单片机控制的LED.LCD显示屏均涉及到各种字体的汉字显示.建立单片机汉字字库的传统方法有使 ...
- 利用Windows命令行解压zip压缩文件(不借助第三方软件)
首先说明一下本文的需求:利用Windows自带的API.DLL或命令行参数等任何手段,解压一个标准的zip压缩文件,并且不借助任何第三方程序. 一.前言--徒劳的探索 为什么会提出这种需求呢?因为我近 ...
- 如何用windows自带工具检测磁盘性能
如何用windows自带工具检测磁盘性能 有一天突然想检测一下磁盘性能,市面上工具大多夹杂垃圾广告包装起来.其实利用windows自带工具就可以轻松检测. 新建txt文件,修改后缀名.bat为脚本文件 ...
- 利用windows 系统的画图工具获取图片上某一点的颜色RGB值
今天编写程序时,想模仿一款软件.包括外观颜色都要求很像,但是总是找不到一个与之相似的颜色,后来就想到了可以先获取RGB三色值,然后直接给控件或者窗体的背景赋值.再网上找到很多获取RGB值得工具,但是都 ...
最新文章
- Docker集群管理工具-Kubernetes部署记录
- open_basedir php.ini,关于PHP文件包含目录配置 open_basedir
- 窗体测试只能用于本地测试_爆料:微软 Win10X 将首先用于测试单屏笔记本
- 使用二进制的方式安装mysql实践纪要
- latex beamer 空一行_握草!一行Python代码写的游戏,我能这样玩一天
- Mac OS X 10.10如何打开虚拟内存
- python怎么学习一门语言_如何学习Python这一门语言
- Linux下socket通信和epoll
- html下拉列表兼容性,下拉菜单select样式设置(兼容IE6/IE7/IE8/火狐)
- dev gridview 打印列数过多_更适合孩子使用的错题打印机,超小体积什么都能打:喵喵机P3测评...
- 线程同步与互斥........
- Android 原生 MediaPlayer 和 MediaCodec 的区别和联系(二)
- 50预训练权重_MMDetection笔记:修改预训练模型权重类别数
- 自由落体运动c语言编程_欧姆龙NX PLC 轴运动功能块,ST和梯形图双语言
- matlab eps 字体,matlab eps 字体用AI打开乱码的解决
- PS教程新手入门(三)--PS实用的技巧教程
- 计算机知识与技能比赛活动总结,中职技能大赛总结(精选6篇)
- Unity4.3.1引擎源码编译过程
- 中国电商靠低价攻入美国市场,亚马逊已经手足无措
- 哈工大计算机网络第一章——计算机网络概述复习
热门文章
- 独一无二 Shell 编程之正则表达式 与文本处理器 详细解释
- 滤波器基础01——滤波器的种类与特性
- 《C》C语言编程实现任意阶数的“m序列”并通过gnuplot绘图——在知道本原多项式的前提下
- 签约喜讯|国盛智科携手瑞云服务云,推动数字化营销服务管理战略升级
- 移植usb无线网卡驱动
- oracle入门常用
- 【攻破html系列——第三天】文本标签和容器标签
- mysql进程daemon_守护进程详解及创建,daemon()使用
- windows 10 php安装教程,win10系统下wnmp的安装教程介绍
- django book的实践