矢量字库的设计与实现

文章编号:100622475 (2006) 0420109203
收稿日期:2005211214
作者简介:邓彬伟(19732) ,男,湖北武汉人,黄石理工学院电气与电子信息工程学院讲师,硕士,研究方向:计算机应用及嵌入
式系统。
矢量字库的设计与实现
邓彬伟
(黄石理工学院电气与电子信息工程学院,湖北黄石 435003)
摘要:矢量字库是使用矢量文字的主要方式。本文以一种轮廓文字位图矢量化的方法为基础,详细介绍了从文字位图数
据抓取、位图轮廓提取、矢量化数据生成、到矢量化字库生成、读取及显示的设计与实现方法。
关键词:矢量字库;文字位图;矢量化
中图分类号:TP311. 52     文献标识码:A
Design and Implementation of Vector Fonts
DENGBin2wei
(School of Electric and Electronic Information Engineering ,Huangshi Institute of Technology , Huangshi  435003 , China)
Abstract : It is main method that vector fonts is adopted by using vector character. The paper introduces the design and implementation of
vector fonts from capturing character bitmap , abstracting bitmap contour and creating vector data to building vector fonts , loading and
displaying based on the algorithm of contour character bitmap vector.
Key words :vector fonts ; character bitmap ; vector
0  引 言
激光雕刻是激光技术在激光加工领域内的重要
应用。激光雕刻系统一般由两部分组成:上位机(高
速的PC) 和下位机(低速控制器) 组成。上位机主要
针对图像处理,下位机主要用于雕刻控制。目前的激
光雕刻系统所处理的图形包括位图和矢量两种。位
图虽然具有来源广泛、格式多样等优点,但位图耗费
的存储空间大、放大易失真,所以雕刻效率低。而矢
量图形是由点、线组成,具有存储空间大小固定、缩放
自如等特点,不仅能提高雕刻速度,而且文件小、放大
无失真,所以雕刻能得到较高效率和精度。特别是针
对高速的流水线,矢量图形具有更加无可比拟的优
势。此外,矢量字库是使用矢量汉字的主要方式。本
文以四个像素点为单元,采用16 方向深层穷尽搜索
扫描方式进行轮廓文字位图矢量化的方法[1 ] 为基础,
详细介绍了从文字位图数据抓取、位图轮廓提取、矢
量化数据生成、到矢量化字库生成、读取及显示的设
计与实现方法。生成的矢量字库具有文件小、字库个
数和字库中数据可自由增减等特点。
1  矢量汉字库设计总体结构
2  矢量汉字库具体设计
2. 1  采用显示和抓屏方法获得文字位图
GB2312280 的内码编码的范围为: 0xA1A1 ~
0xFEFE ,其中一、二级汉字对应的内码范围为0xB0A1
~0xF7FE;也即从一级汉字的第一个汉字“啊”到二级
汉字的最后一个汉字“齄”。
根据内码编码规则,输出所有GB2312280 内码中
的一级汉字和二级汉字和符号到文本编辑控件窗口,
同时抓屏代码抓取每个文字并生成位图文件,文字大
计算机与现代化
 2006 年第4 期J ISUANJ I  YU  XIANDAIHUA 总第128 期
小为100 磅,文字为黑色,背景为白色,色彩数为256
色,采用256 色可使生成的位图不至于太大,并可加
快处理速度。
抓屏步骤:
(1) 记下当前屏幕分辨率,并设置屏幕分辨率为
256 色。
(2) 获得文本编辑控件句柄。
(3) 调用GetDC( ) 函数实现抓图。
(4) 新建TImage 类指针。
(5) 设置图像尺寸。
(6) 调用TImage 类的Picture 下的SaveToFile ( ) 函
数保存抓取的图像。
(7) 恢复原始屏幕分辨率[6 ] 。
2. 2  采用VC ++ 把256 色文字位图转化为单色轮廓
文字位图
  (1) 位图格式。
位图是Windows 中的一种点阵图像格式。Win2
dows 把位图( bitmap) 分成两大类:“设备相关位图”
(Device Dependent Bitmap ,简称DDB) 与“设备独立位
图”(Device Independent Bitmap ,简称DIB) 。“设备独立
位图”就是常见的位图文件。
位图文件格式由三部分组成,即:图片信息、调色
板信息、像素阵列。所谓的位图(BMP) 文件可用下式
表示:
BMP 文件= BITMAPFILEHEADER + BITMAPINFO + 位图数据
=BITMAPFILEHEADER + BITMAPINFOHEADER + RG2
BQUAD 数组+ 位图数据
其中BITMAPFILEHEADER ,BITMAPINFO ,BITMAP2
INFOHEADER 和RGBQUAD 是DIB 有关的结构体。
BITMAPFILEHEADER 结构体有5 个成员共14 字节定
义位图的标记、文件大小和图像数据在文件中的位置
等信息。BITMAPINFO 由BITMAPINFOHEADER 类型
的成员变量和RGBQUAD 类型的成员变量组成。BIT2
MAPINFOHEADER 记录了所有该位图的相关信息。
RGBQUAD 用来记录位图的调色板。如果是真彩色
图,则缺少RGBQUAD 数组部分[5 ] 。
(2) 轮廓提取。
对图像进行轮廓提取和轮廓跟踪的基本方法是:
先根据某些严格的“探测准则”找出目标物体轮廓上
的像素,再根据这些像素的某些特征用一定的“跟踪
准则”找出目标物体上的其他像素。有两种二值图像
轮廓跟踪的算法。其中一种是首先找到第一个边界
像素的“探测准则”,按照从左到右,从下到上的顺序
搜索,找到的第一个黑点一定是最左下方的边界点,
记为A。它的右、右上、上、左上四个邻点中至少有一
个是边界点,记为B。从B 开始找起,按右、右上、上、
左上、左、左下、下、右下的顺序找相邻点中的边界点
C。如果C 就是A 点,则表明已经转了一圈,程序结
束;否则从C 点继续找,直到找到A 为止。判断是不
是边界点的方法是:如果它的上下左右四个邻点都不
是黑点则它即为边界点[2 ] 。
采用以上轮廓跟踪算法,对256 色只有0 (即黑
色) 和255 (即白色) 两种像素值的文字位图进行轮廓
提取生成256 色轮廓文字位图。
(3) 256 色轮廓位图到单色位图转化步骤。
①找到源DIB 图像像素起始位置、图像的宽度、
高度;
②计算源DIB 图像每行的字节数(256 色是8 位
一个像素) 和图像的大小(行字节数3 像素高度+
1078 , (256 色位图文件的头部是14 + 40 字节,调色板
是256 3 4 字节,两者相加为1078 字节) ) ;
③计算2 色位图像素宽度、高度值及每行字节数
和大小;
④生成单色位图文件首部格式;
⑤把256 色位图像素点数据映射成单色位图像素
点数据。
2. 3  采用矢量化算法生成矢量数据和字库
(1) 自定义点结构体(M- POINT) 。
typedef struct
{ unsigned short X;
unsigned short Y;
}M- POINT;
(2) 定义存放矢量数据的结构体(FontStruct) 。
typedef struct{ unsigned short Vertex ; ∥节点的点数
        M- POINT 3 Point ; ∥点
        }FontStruct ;
(3) 一个文字的矢量数据存放规则如下[4 ] :
①一个文字的矢量数据存放在一个指向FontStruct 的指
针中;
②每个文字的矢量数据分几节存放;
③每个文字的节数由调用函数时给出;
④每节的坐标点数放在结构体的Vertex 中;
⑤对应节的点放在结构体的Point 指针中;
⑥以节为单位划直线,即每节的第一个点划直线到第二
个点,第二个点划直线到第三个点依次划到这个节的最后一
个点,节与节之间的点无关。
(4) 矢量字库的存放格式。
110 计 算 机 与 现 代 化2006年第4期
文字名
1
    
总点数
     
总节点数
    
第一节总点数
   
第一节具体点数据
第二节总点数
   
第二节具体点数据
?第
n
节总点数
  

n
节具体点数据
文字名
2
    
?文


n
    
? 第
n
节具体点数据

n
个文字
  其中文字名采用GB2312280 的内码值来保存。
(5) 采用四像素16 方向深层穷尽矢量化算法生
成矢量化数据,矢量化流程如图2 所示[1 ] 。
A:像素值为0 的个数= 0 ?
B :像素坐标置为(0 ,0) ;
C:像素值为0 吗?
D:像素坐标加1 ;
E:记下值为0 的像素单元基准坐标值,做消去处理;
F:从A 方向向B 方向搜索,每个方向搜索完后记下坐标
值,同时减小像素值为0 的记数值;
G:节终止像素单元集中的8 个像素单元的值有为1 的
吗?
H:像素单元为中心的8 3 8 矩阵单元中有像素值为0 ?
I :记下起始坐标。
3  矢量字库的读取
3. 1  矢量字库读取函数以DLL( 动态链接库) 形式
提供[ 3]
extern ″C″- declspec (dllexport) FontStruct 3 VectorFont (char
3 Word ,char 3 FontName ,int 3 PolyCount ,int FontSize) ;
∥功能:输入一个汉字或字符、字体和字号,输出矢量数据
∥输入参数
∥char 3 Word , ∥输入的文字(一个或一个字符) ∥char
3 FontName , ∥字体名
∥int 3 PolyCount , ∥节点个数∥int FontSize ∥自定义字体
大小,1~50 号,1 号最小,50 最大
∥输出参数
∥int 3 PolyCount , ∥节点个数返回节点个数用于申请为
分配字体矢量结构体提供信息
∥返回值;对应输入的汉字字体大小的矢量数据
  ∥注:当3 PolyCount = - 1 取回PolyCount 值,再调用得字
体矢量结构体
3. 2  矢量汉字库读取函数处理步骤
(1) 读取存放矢量汉字库的位置信息的ini 文件
(使用此方法方便软件安装) 。
(2) 从字体列表信息中找到字体所对应的字体库
文件。
(3) 按字体库封装格式解析字体库获得对应文字
的矢量数据。
(4) 最后返回FontStruct 3 类型的指针供文字显
示和处理程序使用。
4  矢量文字几何变换和显示
矢量文字几何变换函数也采用DLL 方式提供,
主要包括矢量文字的平移、缩放、旋转、镜像、转置及
多字几何排列等操作;显示程序根据DLL 返回的结
果(即矢量字体坐标) 调用画线函数在屏幕上显示或
是调用激光雕刻驱动程序进行激光雕刻。
5  结束语
生成的矢量字库及调用读取显示软件[5 ] 已在武
汉楚天激光雕刻系统中得到应用。字库具有文件小、
数据和字库可自由增减等特点,此外,字库读取与矢
量文字几何变换均采用标准C 编写,随着嵌入式系
统存储容量和性能的不断增长,能方便地移植到嵌入
式系统中。
参考文献:
[1 ]  邓彬伟, 黄志红, 张和平, 朱绍文. 对文字进行矢量化
的一种算法研究[J ] . 计算机应用研究,2005 ,22 (7) :172
~174.
[2 ]  何斌,马天予, 王运坚, 朱红莲. Visual C ++ 数字图像
处理[M] . 北京:人民邮电出版社, 2002. 435~444.
[3 ]  [ 美]Ben Ezzell , Jim Blaney. Windows 98 高级开发指南
[M] . 邱仲潘,等译. 北京:电子工业出版社, 1999. 33~
240.
[4 ]  Autodesk Inc. AutoCAD DXF Version 14 File Format (Win2
dows Help Format) [DBPOL ] . http: ∥www.wotsit. orgPsearch.
asp ? s = dxf ,2003210231.
[5 ]  林俊杰. Visual C ++ 6 程序设计经典[M] . 北京科学出版
社,1999.
[6 ]  刘振安, 刘大路, 张蕊, 秦俊. C ++ Builder 4 编程技术
[M] . 北京:人民邮电出版社,1999.
 2006年第4期邓彬伟:矢量字库的设计与实现111

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值