从矢量字库中获取近似汉字点阵

合集下载

点阵LED显示原理与点阵汉字库的编码和从标准字库中提取汉字编码的方法

点阵LED显示原理与点阵汉字库的编码和从标准字库中提取汉字编码的方法

点阵LED显示原理与点阵汉字库的编码和从标准字库中提取汉字编码的方法。

2009年06月03日下午04:27一.实验要求编程实现中英文字符的显示。

二.实验目的1.了解LED点阵显示的基本原理和实现方法。

2.掌握三.实验电路及连线点阵显示模块WTD3088的(红色)列输入线接至内部LED的阴极端,行输入线接至内部LED的阳极端(若阳极端输入为高电平,阴极端输入低电平,则该LED点亮)。

发光点的分布如图22-0所示。

Fig 22-0 WTD3088 LED分布如图22-1示,本实验模块使用74LS374来控制列输入线的电平值。

将74LS374的某输出置0,则对应的LED阴极端被置低。

如图22-2示,本实验模块使用74LS273来控制行输入线,并通过9013提供电流驱动。

将74LS273的某输出置1,则对应的LED阳极端被置高。

每次系统重新开启或总清后,74LS273输出为全0,LED显示被关闭。

通过编程控制各显示点对应LED阳极和阴极端的电平,就可以有效的控制各显示点的亮灭。

Fig 22-1 LED模块及列扫描电路Fig 22-2 行扫描电路Fig 22-3地址译码电路本实验模块使用4块WTD3088组成16×16点阵,以满足汉字显示的要求。

为了方便的控制四个单元,使用了一片74LS139译码,产生四个地址片选信号:CLKR1= CSLED,CLKR2= CSLED+1,用于行控制的两片74LS273;CLKC1= CSLED+2,CLKC2= CSLED+3,用于列控制的两片74LS374。

实验接线:按示例程序,模块的CSLED接51/96地址的8000H。

四.实验说明使用高亮度LED发光管构成点阵,通过编程控制可以显示中英文字符、图形及视频动态图形。

LED显示以其组构方式灵活、亮度高、技术成熟、成本低廉等特点在证券、运动场馆及各种室内/外显示场合得到广泛的应用。

所显示字符的点阵数据可以自行编写(即直接点阵画图),也可从标准字库(如ASC16、HZ16)中提取。

Windows矢量字体点阵数据提取的实现方法

Windows矢量字体点阵数据提取的实现方法

Windows矢量字体点阵数据提取的实现方法王小亮;王勇;汤永科;秦磊【摘要】Character display is widely used in embedded systems,especially for the embedded systems design without OS,getting lattice of character has played a crucial role in embedded paring with the general technique to get lattice of vector font through bit-map,this paper introduces a new method that can easily and quickly get lattice of any vector font installed in Windows system by using API of Windows OS.The program interface is simple and beautiful,and the function of the program is powerful and practical.%字符显示在嵌入式系统有着广泛的应用,尤其是在没有操作系统的嵌入式设计中,提取字符点阵数据已经成为嵌入式设计中的关键一步。

相比于一般通过位图方式来获取字符点阵数据,本文介绍了如何利用 Windows操作系统提供API函数提取矢量字体点阵数据的方法,程序可以方便快速提取Windows系统所安装的所有矢量字体的点阵数据。

程序界面简洁美观,功能强大,实用性强。

【期刊名称】《单片机与嵌入式系统应用》【年(卷),期】2014(000)006【总页数】4页(P30-33)【关键词】嵌入式系统;矢量字体;点阵;快速;API【作者】王小亮;王勇;汤永科;秦磊【作者单位】四川大学电子信息学院,成都 610044;四川大学电子信息学院,成都 610044;四川大学电子信息学院,成都 610044;四川大学电气信息学院【正文语种】中文【中图分类】TP399随着显示技术日新月异的发展,各种性能的显示器越来越广泛地运用于嵌入式产品中。

从矢量字库中获取近似汉字点阵

从矢量字库中获取近似汉字点阵

当 汉 字 输 出 到 Pc rB x控 件 后 . 于 它 还 是 一 it e o u 由
个 矢 量 汉 字 . 何 把 该 汉 字 的 点 阵 数 据 按 找 单 片 机 系 如
网:
统 L D显 示 屏 点 阵 格 式 读 取 出 来 呢 ? 比较 下 面 两 个 C
r F中字体 的汉字转换为点阵汉字 .从而在使 L D电 r C
■ ■
图 1 图 2
在 网 1中 . 择 最 佳 的 的 字 体 尺 寸 . 红 色 作 为 选 以
前 景 色 , 色 为 背 景 色 , Peue o 控 件 输 出 汉 字 . 黑 在 itrB x
的 高 度 和 宽 度
并 且 使 Pc rB x控 件 的 高 度 和 宽 度 等 于 输 出 汉 字 it e o u
和 窗 体 F r 一 样 可 以 在 控 件 内绘 制 图 形 和 输 出文 字 om
的 控 件 , 可 以 按 照 设 置 的字 体 、 型 和 字 号 . 它 字 以及 前
票 交 易 所 的 信 息 显 示 . 显 示 的 汉 字 . 般 来 自 点 阵 其 一 字 库 , P 时 代 点 阵 字 库 也 只 有 寥 寥 几 个 :2 1 而 C 1x 2和 1 x 6的宋 体 .4 2 宋 或 者 宋 体 因此 一 般 L D 显 61 2 x 4仿 C 示 屏 上 的 汉 字 字 体 比较 单 调 而 点 阵 字 库 可 以 在 U — C
汉字 , 换 为点 阵汉 字的 的方 法 , L 转 使 CD 显 示 屏 显 示 的 汉 字 的 字 体 不 局 限 于 现 有 的 点
阵字库 。
关 键 词 :矢 量 字 体 ;汉 字 点 阵 :L CD

一种从汉字库中快速提取汉字点阵的实现方法

一种从汉字库中快速提取汉字点阵的实现方法
E L D点 阵显 示 屏 ( 即发 光 二级 管矩 阵显 示 屏 ) 如今 的 工 业 生 产 和 日常生 活 中 的应 用 越 来 越 广 泛 . 在 这 种显 示 屏 是 以 8×8 阵 为基 础 的 , 了增 大 显示 字符 , 点 为 可将 多块 8×8点 阵 组合 成 1 6×1 ,4×2 62 4或 更大 的点 阵 . 在 大多 数点 阵显 示 屏 都 是 用 可 编 程 的 E R M 或 单 片机 系 统 通过 动 态 扫 描 的 方 法 实 现 现 PO 的 , 而无 论 是 E R M 还是 单 片 机 系统 , 要显 示 一个 汉 字 , 需要 实 现将 要 显示 的汉 字 的点 阵 显示 码 然 PO 若 都 绘 制 出来 , 后 交 给控 制 系统 的列 选输 出线 去驱 动 二 级 管 发光 . 果 采用 手 工 的 方 法绘 制 汉 字 点 阵 , 然 如 不 仅 工作 量 很 大 , 而且 容 易 出错 . 文介 绍 了一 种直 接 从 U D S的汉字 库 中快 速提 取 汉字 点 阵 的方 法 , 本 CO 利 用该 程 序 可 以一 次 从 汉 字库 中得 到 多个汉 字 的点 阵 ,
使 表示 汉 字 的两个 字 节 的最 高 位 等 于 1这种 高 位 为 1 . 的双 字 节 汉 字 编码 就 称 为汉 字 的机 内码 , 称 内 又
码.
例如 “ ” 的 区位 码 为 0 1 10 0 0 1 , 大 字 0 0 0 1 10 1 国标 码 为 0 1 10 10 1 , 码是 1 10 0 1 10 1 . 100 1 10 1 内 0 1 10 1 10 1
1 汉 字 编 码 简 介
中文 的 基本 组 成 是 汉字 , 计 算机 中 , 字也 是 字 符 . 文 字母 和 一 些 符 号 在 计 算 机 的 内存 中 占一 在 汉 英 个字 节 , 而汉 字 则 占两 个 字 节 . 了适 应计 算 机 处 理 汉 字 的需 要 , 国 于 18 年 颁 布 了《 息 交 换 用 汉 为 我 91 信

Windows矢量字体点阵数据提取的实现方法

Windows矢量字体点阵数据提取的实现方法
Ke y wo r d s: e m be dd e d s y s t e m s;v e c t o r f ont ;l a t t i c e;s p e e d;API
是 通 过 一 定 的 方 式 预 先 储 存 在 计 算 机 系 统 的文 件 中 , 当 操
引 言
2 . Co l l e g e o f El e c t r i c a l En g i n e e r i n g a n d I n f o r ma t i o n,S i c h u a n Un i v e r s i t y ) A b s t r a c t :Ch a r a c t e r d i s p l a y i s wi d e l y u s e d i n e mb e d d e d s y s t e ms ,e s p e c i a l l y f o r t h e e mb e d d e d s y s t e ms d e s i g n wi t h o u t OS,g e t t i n g l a t t i c e
摘 要 :字 符 显 示 在 嵌 入 式 系统 有 着广 泛 的 应 用 , 尤其 是 在 没 有 操 作 系统 的 嵌 入 式 设 计 中 , 提 取 字 符 点 阵数 据 已 经 成 为 嵌
入 式设 计 中的 关键 一 步 。相 比 于 一般 通过 位 图 方 式 来 获 取 字符 点 阵数 据 , 本 文 介 绍 了如 何 利 用 Wi n d o ws操 作 系统提 供


鹫 ≥

Wi n d o ws 矢 量 字 体 点 阵 数 据 提 取 的 实 现 方 法
王 小 亮 。 王 勇 汤 永 科 。 秦 磊

基于VB60的点阵字模信息提取方法

基于VB60的点阵字模信息提取方法

—283—·开发研36卷 第11期ol.36 No.11 2010年6月June 2010究与设计技术· 文章编号:1000—3428(2010)11—0283—02文献标识码:A中图分类号:TN873⎤⎦基于VB6.0的点阵字模信息提取方法王春武,刘春玲,姜文龙(吉林师范大学信息技术学院,四平 136000)摘 要:提出通过颜色法提取像素点的汉字点阵字模信息提取方法,给出基于VB6.0的系统控件设置及流程实现方法。

与基于内码法的汉字点阵提取方法的比较结果表明,该方法能够方便地修改显示内容、字体及字号,丰富LED 或LCD 显示屏控制系统的字体显示效果,提高其工作效率。

关键词:点阵显示;点阵字模提取;区位码Extraction Method of Dot Matrix Font InformationBased on VB6.0WANG Chun-wu, LIU Chun-ling, JIANG Wen-long(College of Information & Technology, Jilin Normal University, Siping 136000)【Abstract 】This paper proposes an extraction method of Chinese characters dot matrix font information based on pixels color, provides control setting method and implementation method of the system with VB6.0. Compared with conventional methods of extracting Chinese characters internal codes, the method can easily modify the display content, font and font size, effectively enrich the font display of LED or LCD display control system, and improve their efficiency.【Key words 】dot matrix display; dot matrix font extraction; region-position code计 算 机 工 程 Computer Engineering 第V 1 概述点阵字体也叫位图字体,其中每个字形都以一组二维点阵信息表示。

从字库IC中获取点阵数据(程序)

从字库IC中获取点阵数据(程序)
void PrintReadLineChinese16x16(uint8 *ptr, uint8 num)
{
uint8 i, k=0;
uint32 offSet;
offSet = ((*ptr - 0xA1)*94 + (*(ptr+1) - 0xA1))*32; // 汉字的地址是从0xA1A1开始
FontStartEn8x16 :为8x16的ASCII字符点阵在Flash IC中的起始地址,这个在下载字库到Flash IC中时进行确定。
FontStartCn16x16 :为16x16的GB2312字库点阵数据在Flash IC中的起始地址,这个在下载字库到Flash IC中时进行确定。
* FunctionName : PrintReadLineChar8x16()
* Description : 从字库中读取一个字符放入缓冲区
* EntryParameter : ptr - 字符编码,num - 数据存放打印缓冲的位置
* ReturnValue : None
* EntryParameter : buf - 缓冲区
* ReturnValue : 0 - 本行结束;1 - 所有缓冲结束
**************************************************************************************/
for (i=0; i<16; i++)
{
// 0x20以前的字符没有使用,这个跟生成字库时的选择有关
// 有ptr编码找到相应的点阵数据,把其放入行缓冲区
PrintLineBuf[i][num] = SSTReadByte(FontStartEn8x16 + ((*ptr-0x20)*16) + i);

Windows矢量字体字模的提取

Windows矢量字体字模的提取

Windows矢量字体字模的提取摘要:利用Windows提供的丰富的字体库,调用Win32 API函数,将矢量汉字文本转化为位图,以提取汉字字模,用于电子系统的信息显示。

关键词: Windows矢量字体Win32 API函数汉字字模位图很多场合都需要用到汉字显示,如公共汽车上用来报站的电子显示牌、商场用来显示各种商品信息的电子显示牌等。

Windows提供了丰富的字体库。

如何利用这些字体库进行汉字显示,是需要解决的一个问题。

Windows支持GDI字体和设备字体二大类字体。

GDI字体存储在硬盘文件中,而设备字体是输出设备所固有的。

GDI字体分为三种类型:点阵字体、笔划字体和TrueType字体。

点阵字体的字模可以从字库文件中直接得到,而后二种是矢量字体,无法直接得到它们的字模,所以必须将笔划字体和TrueType字体点阵化,以获得所需要的字模。

通常情况下,电子系统的信息显示使用16&times;16(32字节)的点阵字库,例如在Win98下的Chs16.fon即为16&times;16(32字节)的字库文件。

从中提取字模的方法是:汉字的内码为二个字节,设为a和b。

a的大小应该介于0xa1和0xfe之间,其区码为qu=a-0xa0,位码为wei=b-0xa0,汉字字模在字库文件中的位置为offset=((qu-1)&times;94+(wei-1))&times;32。

本文主要介绍从Windows的矢量字体中提取字模的方法。

此方法已成功地运用于单片机系统设计中,解决了汉字显示的问题。

在实际应用中,可以直接调用Win32 API函数,将需要提取字模的汉字文本转化为位图,以此实现汉字的点阵化,用来提取字模。

1 字体设置首先需要设置字体。

Win32 SDK提供了用于字体选择的通用对话框,只需调用ChooseFont函数,其返回值为一个布尔值。

具体定义为BOOL ChooseFont(LPCHOOSEFONT lpcf)。

点阵字库和矢量字库

点阵字库和矢量字库

点阵字库的生产原理(转)2011-05-17 15:31:45| 分类:其他技术| 标签:|字号大中小订阅点阵字库的生产原理所有的汉字或者英文都是下面的原理,由左至右,每8个点占用一个字节,最后不足8个字节的占用一个字节,而且从最高位向最低位排列。

生成的字库说明:(以12×12例子)一个汉字占用字节数:12÷8=1····4也就是占用了2×12=24个字节。

编码排序A0A0→A0FE A1A0→A2FE依次排列。

以12×12字库的“我”为例:“我”的编码为CED2,所以在汉字排在CEH-AOH=2EH区的D2H-A0H=32H个。

所以在12×12字库的起始位置就是[{FE-A0}*2EH+32H]*24=104976开始的24个字节就是我的点阵模。

其他的类推即可。

英文点阵也是如此推理。

在DOS程序中使用点阵字库的方法首先需要理解的是点阵字库是一个数据文件,在这个数据文件里面保存了所有文字的点阵数据.至于什么是点阵,我想我不讲大家都知道的,使用过"文曲星"之类的电子辞典吧,那个的液晶显示器上面显示的汉子就能够明显的看出"点阵"的痕迹.在 PC 机上也是如此,文字也是由点阵来组成了,不同的是,PC机显示器的显示分辨率更高,高到了我们肉眼无法区分的地步,因此"点阵"的痕迹也就不那么明显了.点阵、矩阵、位图这三个概念在本质上是有联系的,从某种程度上来讲,这三个就是同义词.点阵从本质上讲就是单色位图,他使用一个比特来表示一个点,如果这个比特为0,表示某个位置没有点,如果为1表示某个位置有点.矩阵和位图有着密不可分的联系,矩阵其实是位图的数学抽象,是一个二维的阵列.位图就是这种二维的阵列,这个阵列中的 (x,y) 位置上的数据代表的就是对原始图形进行采样量化后的颜色值.但是,另一方面,我们要面对的问题是,计算机中数据的存放都是一维的,线性的.因此,我们需要将二维的数据线性化到一维里面去.通常的做法就是将二维数据按行顺序的存放,这样就线性化到了一维.那么点阵字的数据存放细节到底是怎么样的呢.其实也十分的简单,举个例子最能说明问题.比如说 16*16 的点阵,也就是说每一行有16个点,由于一个点使用一个比特来表示,如果这个比特的值为1,则表示这个位置有点,如果这个比特的值为0,则表示这个位置没有点,那么一行也就需要16个比特,而8个比特就是一个字节,也就是说,这个点阵中,一行的数据需要两个字节来存放.第一行的前八个点的数据存放在点阵数据的第一个字节里面,第一行的后面八个点的数据存放在点阵数据的第二个字节里面,第二行的前八个点的数据存放在点阵数据的第三个字节里面,…,然后后面的就以此类推了.这样我们可以计算出存放一个点阵总共需要32个字节.看看下面这个图形化的例子:| |1| | | | | | | | | | |1| | | || | |1|1| |1|1|1|1|1|1|1|1|1| | || | | |1| | | | | | | | |1| | | ||1| | | | | |1| | | | | |1| | | || |1|1| | | |1| | | | | |1| | | || | |1| | | |1| | | | |1| | | | || | | | |1| | |1| | | |1| | | | || | | |1| | | |1| | |1| | | | | || | |1| | | | | |1| |1| | | | | ||1|1|1| | | | | | |1| | | | | | || | |1| | | | | |1| |1| | | | | || | |1| | | | |1| | | |1| | | | || | |1| | | |1| | | | | |1| | | || | |1| | |1| | | | | | |1|1|1| || | | | |1| | | | | | | | |1| | || | | | | | | | | | | | | | | | |可以看出这是一个"汉"字的点阵,当然文本的方式效果不是很好.根据上面的原则,我们可以写出这个点阵的点阵数据:0x40,0x08,0x37,0xfc,0x10,0x08,…, 当然写这个确实很麻烦所以我不再继续下去.我这样做,也只是为了向你说明,在点阵字库中,每一个点阵的数据就是按照这种方式存放的.当然也存在着不规则的点阵,这里说的不规则,指的是点阵的宽度不是8的倍数,比如12*12 的点阵,那么这样的点阵数据又是如何存放的呢?其实也很简单,每一行的前面8个点存放在一个字节里面,每一行的剩下的4点就使用一个字节来存放,也就是说剩下的4个点将占用一个字节的高4位,而这个字节的低4位没有使用,全部都默认的为零.这样做当然显得有点浪费,不过却能够便于我们进行存放和寻址.对于其他不规则的点阵,也是按照这个原则进行处理的.这样我们可以得出一个 m*n 的点阵所占用的字节数为 (m+7)/8*n.在明白了以上所讲的以后,我们可以写出一个显示一个任意大小的点阵字模的函数,这个函数的功能是输出一个宽度为w,高度为h的字模到屏幕的 (x,y) 坐标出,文字的颜色为color,文字的点阵数据为 pdata 所指:/*输出字模的函数*/void _draw_model(char *pdata, int w, int h, int x, int y, int color){int i; /* 控制行 */int j; /* 控制一行中的8个点 */int k; /* 一行中的第几个"8个点"了 */int nc; /* 到点阵数据的第几个字节了 */int cols; /* 控制列 */BYTE static mask[8]={128, 64, 32, 16, 8, 4, 2, 1}; /* 位屏蔽字 */w = (w + 7) / 8 * 8; /* 重新计算w */nc = 0;for (i=0; i<h; i++){cols = 0;for (k=0; k<w/8; k++){for (j=0; j<8; j++){if (pdata[nc]&mask[j])putpixel(x+cols, y+i, color);cols++;}nc++;}}}代码很简单,不用怎么讲解就能看懂,代码可能不是最优化的,但是应该是最易读懂的.其中的 putpixel 函数,使用的是TC提供的 Graphics 中的画点函数.使用这个函数就可以完成点阵任意大小的点阵字模的输出.接下来的问题就是如何在汉子库中寻址某个汉子的点阵数据了.要解决这个问题,首先需要了解汉字在计算机中是如何表示的.在计算机中英文可以使用 ASCII 码来表示,而汉字使用的是扩展 ASCII 码,并且使用两个扩展 ASCII 码来表示一个汉字.一个 ASCII 码使用一个字节表示,所谓扩展 ASCII 码,也就是 ASCII 码的最高位是1的 ASCII 码,简单的说就是码值大于等于 128 的 ASCII 码.一个汉字由两个扩展 ASCII 码组成,第一个扩展ASCII 码用来存放区码,第二个扩展 ASCII 码用来存放位码.在 GB2312-80 标准中,将所有的汉字分为94个区,每个区有94个位可以存放94个汉字,形成了人们常说的区位码,这样总共就有 94*94=8836 个汉字.在点阵字库中,汉字点阵数据就是按照这个区位的顺序来存放的,也就是最先存放的是第一个区的汉字点阵数据,在每一个区中有是按照位的顺序来存放的.在汉字的内码中,汉字区位码的存放实在扩展 ASCII 基础上存放的,并且将区码和位码都加上了32,然后存放在两个扩展 ASCII 码中.具体的说就是:第一个扩展ASCII码 = 128+32 + 汉字区码第二个扩展ASCII吗 = 128+32 + 汉字位码如果用char hz[2]来表示一个汉字,那么我可以计算出这个汉字的区位码为:区码 = hz[0] - 128 - 32 = hz[0] - 160位码 = hz[1] - 128 - 32 = hz[1] - 160.这样,我们可以根据区位码在文件中进行殉职了,寻址公式如下:汉字点阵数据在字库文件中的偏移 = ((区码-1) * 94 + 位码) * 一个点阵字模占用的字节数在寻址以后,即可读取汉字的点阵数据到缓冲区进行显示了.以下是实现代码:/* 输出一个汉字的函数 */void _draw_hz(char hz[2], FILE *fp, int x, int y, int w, int h, int color){char f ON tbuf[128]; /* 足够大的缓冲区,也可以动态分配 */int ch0 = (BYTE)hz[0]-0xA0; /* 区码 */int ch1 = (BYTE)hz[1]-0xA0; /* 位码 *//* 计算偏移 */long offset = (long)pf->_hz_buf_size * ((ch0 - 1) * 94 + ch1 - 1);fseek(fp, offset, SEEK_SET); /* 进行寻址 */ fread(fontbuf, 1, (w + 7) / 8 * h, fp); /* 读入点阵数据 */ _draw_model(fontbuf, w, h, x, y, color); /* 绘制字模 */}以上介绍完了中文点阵字库的原理,当然还有英文点阵字库了.英文点阵字库中单个点阵字模数据的存放方式与中文是一模一样的,也就是对我们所写的 _draw_model 函数同样可以使用到英文字库中.唯一不同的是对点阵字库的寻址上.英文使用的就是 ASCII 码,其码值是0到127,寻址公式为:英文点阵数据在英文点阵字库中的偏移 = 英文的ASCII码 * 一个英文字模占用的字节数可以看到,区分中英文的关键就是,一个字符是 ASCII 码还是扩展 ASCII 码,如果是ASCII 码,其范围是0到127,这样是使用的英文字库,如果是扩展 ASCII 码,则与其后的另一个扩展 ASCII 码组成汉字内码,使用中文字库进行显示.只要正确区分 ASCII 码的类型并进行分别的处理,也就能实现中英文字符串的混合输出了.点阵字库和矢量字库的差别我们都只知道,各种字符在电脑屏幕上都是以一些点来表示的,因此也叫点阵.最早的字库就是直接把这些点存储起来,就是点阵字库.常见的汉字点阵字库有 16x16, 24x24 等.点阵字库也有很多种,主要区别在于其中存储编码的方式不同.点阵字库的最大缺点就是它是固定分辨率的,也就是每种字库都有固定的大小尺寸,在原始尺寸下使用,效果很好,但如果将其放大或缩小使用,效果就很糟糕了,就会出现我们通常说的锯齿现象.因为需要的字体大小组合有无数种,我们也不可能为每种大小都定义一个点阵字库.于是就出现了矢量字库.矢量字库矢量字库是把每个字符的笔划分解成各种直线和曲线,然后记下这些直线和曲线的参数,在显示的时候,再根据具体的尺寸大小,画出这些线条,就还原了原来的字符.它的好处就是可以随意放大缩小而不失真.而且所需存储量和字符大小无关.矢量字库有很多种,区别在于他们采用的不同数学模型来描述组成字符的线条.常见的矢量字库有 Type1字库和Truetype字库.在点阵字库中,每个字符由一个位图表示(如图2.5所示),并把它用一个称为字符掩膜的矩阵来表示,其中的每个元素都是一位二进制数,如果该位为1表示字符的笔画经过此位,该像素置为字符颜色;如果该位为0,表示字符的笔画不经过此位,该像素置为背景颜色.点阵字符的显示分为两步:首先从字库中将它的位图检索出来,然后将检索到的位图写到帧缓冲器中.在实际应用中,同一个字符有多种字体(如宋体、楷体等),每种字体又有多种大小型号,因此字库的存储空间十分庞大.为了减少存储空间,一般采用压缩技术.矢量字符记录字符的笔画信息而不是整个位图,具有存储空间小,美观、变换方便等优点.例如:在AutoCAD中使用图形实体-形(Shape)-来定义矢量字符,其中,采用了直线和圆弧作为基本的笔画来对矢量字符进行描述. 对于字符的旋转、放大、缩小等几何变换,点阵字符需要对其位图中的每个象素进行变换,而矢量字符则只需要对其几何图素进行变换就可以了,例如:对直线笔画的两个端点进行变换,对圆弧的起点、终点、半径和圆心进行变换等等.矢量字符的显示也分为两步.首先从字库中将它的字符信息.然后取出端点坐标,对其进行适当的几何变换,再根据各端点的标志显示出字符.轮廓字形法是当今国际上最流行的一种字符表示方法,其压缩比大,且能保证字符质量.轮廓字形法采用直线、B样条/Bezier曲线的集合来描述一个字符的轮廓线.轮廓线构成一个或若干个封闭的平面区域.轮廓线定义加上一些指示横宽、竖宽、基点、基线等等控制信息就构成了字符的压缩数据.如何使用Windows的系统字库生成点阵字库?我的程序现在只能预览一个汉字的不同字体的点阵表达.界面很简单: 一个输出点阵大小的选择列表(8x8,16x16,24x24等),一个系统中已有的字体名称列表,一个预览按钮,一块画图显示区域.得到字体列表的方法:(作者称这一段是用来取回系统的字体,然后添加到下拉框中) //取字体名称列表的回调函数,使用前要声明一下该方法int CALLBACK MyEnumF ON tProc(ENUMLOGFONTEX* lpelf,NEWTEXTMETRICEX* lpntm,DWORD nFontType,long lParam){CFontPeekerDlg* pWnd=(CFontPeekerDlg*) lParam;if(pWnd){if( pWnd->m_combo_sfont.Find ST ring(0, lpelf->elfLogFont.lfFaceName) <0 )pWnd->m_combo_sfont.AddString(lpelf->elfLogFont.lfFaceName);return 1;}return 0;}//说明:CFontPeekerDlg 是我的dialog的类名, m_combo_sfont是列表名称下拉combobox关联的control变量//调用的地方 (******问题1:下面那个&lf怎么得到呢……){::EnumFontFamiliesEx((HDC) dc,&lf, (FONTENUMPROC)MyEnumFontProc,(LPARAM) this,0);m_combo_sfont.SetCurSel(0);}字体预览:如果点阵大小选择16,显示的时候就画出16x16个方格.自定义一个类CMyStatic继承自CStatic,用来画图.在CMyStatic的OnPaint()函数中计算并显示.取得字体:常用的方法:用CreateFont创建字体,把字TextOut再用GetPixel()取点存入数组. 缺点:必须把字TextOut出来,能在屏幕上看见,不爽.我的方法,用这个函数:GetGlyphOutline(),可以得到一个字的轮廓矢量或者位图.可以不用textout到屏幕,直接取得字模信息函数原型如下:DWORD GetGlyphOutline(HDC hdc, //画图设备句柄UINT uChar, //将要读取的字符/汉字 UINT uFormat, //返回数据的格式(字的外形轮廓还是字的位图) LPGLYPHMETR ICS lpgm, // GLYPHMETRICS结构地址,输出参数DWORD cbBuffer, //输出数据缓冲区的大小LPVOID lpvBuffer, //输出数据缓冲区的地址CO NS T MAT2 *lpmat2 //转置矩阵的地址);说明:uChar字符需要判断是否是汉字还是英文字符.中文占2个字节长度.lpgm是输出函数,调用GetGlyphOutline()是无须给lpgm 赋值.lpmat2如果不需要转置,将 eM11.value=1; eM22.value=1; 即可.cbBuffer缓冲区的大小,可以先通过调用GetGlyphOutline(……lpgm, 0, NULL, mat); 来取得,然后动态分配lpvBuffer,再一次调用GetGlyphOutline,将信息存到lpvBuffer. 使用完毕后再释放lpvBuffer.程序示例:(***问题2:用这段程序,我获取的字符点阵总都是一样的,不管什么字……)……前面部分省略……GLYPHMETRICS glyph;MAT2 m2;memset(&m2, 0, sizeof(MAT2));m2.eM11.value = 1;m2.eM22.value = 1;//取得buffer的大小DWORD cbBuf = dc.GetGlyphOutline( nChar, GGO_BITMAP, &glyph,0L, NULL, &m2);BYTE* pBuf=NULL;//返回GDI_ERROR表示失败.if( cbBuf != GDI_ERROR ){pBuf = new BYTE[cbBuf];//输出位图GGO_BITMAP 的信息.输出信息4字节(DWORD)对齐dc.GetGlyphOutline( nChar, GGO_BITMAP, &glyph, cbBuf, pBuf, &m2);}else{if(m_pFont!=NULL)delete m_pFont;return;}编程中遇到问题:一开始,GetGlyphOutline总是返回-1,getLastError显示是"无法完成的功能",后来发现是因为调用之前没有给hdc设置Font.后来能取得pBuf信息后,又开始郁闷,因为不太明白bitmap的结果是按什么排列的.后来跟踪汉字"一"来调试(这个字简单),注意到了 glyph.gmBlackBoxX 其实就是输出位图的宽度,glyph.gmBlackBoxY就是高度.如果gmBlackBoxX=15,glyph.gmBlackBoxY=2,表示输出的pBuf中有这些信息:位图有2行信息,每一行使用15 bit来存储信息.例如:我读取"一":glyph.gmBlackBoxX = 0x0e,glyph.gmBlackBoxY=0x2; pBuf长度cbBuf=8 字节pBuf信息: 00 08 00 00 ff fc 00 00字符宽度 0x0e=14 则第一行信息为: 0000 0000 0000 100 (只取到前14位)第二行根据4字节对齐的规则,从0xff开始 1111 1111 1111 110看出"一"字了吗?呵呵直到他的存储之后就可以动手解析输出的信息了.我定义了一个宏#define BIT(n) (1<<(n)) 用来比较每一个位信息时使用后来又遇到了一个问题,就是小头和大头的问题了.在我的机器上是little endian的形式,如果我用unsigned long *lptr = (unsigned long*)pBuf;//j from 0 to 15if( *lptr & BIT(j) ){//这时候如果想用j来表示写1的位数,就错了}因为从字节数组中转化成unsigned long型的时候,数值已经经过转化了,像上例中,实际上是0x0800 在同BIT(j)比较.不多说了,比较之前转化一下就可以了if( htonl(*lptr) & BIT(j) )Unicode中文点阵字库的生成与使用点阵字库包含两部分信息.首先是点阵字库文件头信息,它包含点阵字库文字的字号、多少位表示一个像素,英文字母与符号的size、起始和结束 unicode编码、在文件中的起始偏移,汉字的size、起始和结束unicode编码、在文件中的起始偏移.然后是真实的点阵数据,即一段段二进制串,每一串表示一个字母、符号或汉字的点阵信息.要生成点阵字库必须有文字图形的来源,我的方法是使用ttf字体.ttf字体的显示采用的是SDL_ttf库,这是开源图形库SDL的一个扩展库,它使用的是libfreetype以读取和绘制ttf字体.它提供了一个函数,通过传入一个Unicode编码便能输出相应的文字的带有alpha 通道的位图.那么我们可以扫描这个位图以得到相应文字的点阵信息. 由于带有alpha通道,我们可以在点阵信息中也加入权值,使得点阵字库也有反走样效果.我采用两位来表示一个点,这样会有三级灰度(还有一个表示透明).点阵字库的显示首先需要将文件头信息读取出来,然后根据unicode编码判断在哪个区间内,然后用unicode编码减去此区间的起始unicode编码,算出相对偏移,并加上此区间的文件起始偏移得到文件的绝对偏移,然后读出相应位数的数据,最后通过扫描这段二进制串,在屏幕的相应位置输出点阵字型.显示点阵字体需要频繁读取文件,因此最好做一个固定大小的缓存,采用LRU置换算法维护此缓存,以减少磁盘读取.。

毕业设计论文-汉字点阵字模自动生成及镶边处理程序编程开发

毕业设计论文-汉字点阵字模自动生成及镶边处理程序编程开发

摘要点阵的显示和镶边处理在各行各业都有广泛的应用,在电视、电脑、手机、遥控器等的液晶显示屏上,都可以看见点阵的应用。

点阵是为集中反映晶体结构的周期性而引入的一个概念,通过点阵可以表示一系列的结构,可以是符号、图像或者汉字等。

本文讨论的是在中文Windows操作系统环境下,通过系统自带的矢量字体库取出对应字体的文字,将其表示为比特图的形式,进而转换为点阵的表示,并在屏幕上绘出点阵文字,以及在对应的点阵文字上进行镶边处理,生成对应字体的点阵字库。

利用VISUAL C++及其MFC进行界面编程,通过消息事件实现所需的功能。

其中主要的镶边算法为:对于一个汉字的点阵数组,按行列依次遍历每一个点,对每一个点判断周围的8个点是否有笔画存在,借此判断该点是否为边界点,如果该点上没有笔画存在则将该点显示为字的边,由此动态地实时地进行镶边处理。

此算法中并没有考虑生成边界的美观性,介于点阵镶边的局限性及镶边算法的难度,本文中的点阵镶边并没有针对笔画进行边界区分。

本文中生成的字库是基于GB2312标准的,按照区位码表的存储方式,存储固定尺寸(如16*16,24*24等)的点阵字体,并实现了指定区位码字符的读取显示功能。

关键词:点阵字体;字体转换;镶边算法;字库;C++;MFCABSTRACTDot matrix display and the edge treatment widely used in all walks of life, in television, computers, cell phones, remote control, LCD display, etc., can see the dot matrix of the application. Dot matrix is a concentrated reflection of the periodic crystal structure and the introduction of a concept lattice can be expressed through a series of structures, can be symbols, images or characters, etc..This article discusses Windows operating system in the Chinese environment, through the system comes with the corresponding vector font library removed the text font, expressed as bit-map of its form, then converted to dot-matrix representation, and draw points on the screen Front text, and text in the corresponding dot matrix trim on handle, generate the corresponding character dot matrix font. Using VISUAL C + + and MFC to interface programming, by news events to achieve the required functionality. One of the major trim algorithm: For a Chinese character dot-matrix array, according to the ranks of traversing each point in turn, on every point around 8 points to judge whether the stroke exist, to determine whether the point of the boundary points, if the point is that there is no point strokes appear as characters in the side, thus dynamically in real time to trim treatment. This algorithm does not take into account the aesthetics of the border generated, between the limitations of dot matrix trim and the trim algorithm difficulty, this article is not for the dot matrix trim distinguish between strokes to the boundary.Generated in this article are based on GB2312 standard font, in accordance with the location code table is stored, store fixed size (eg 16x16, 24x24, etc.) of the dot matrix fonts, and to achieve a specified area code characters read display.Key words: dot matrix fonts; font conversion; trim algorithm; font library;C + +; MFC目录第一章绪论 (1)1.1 课题的综述 (1)1.2 设计目标 (1)第二章准备知识 (2)2.1 字体 (2)2.1.1 矢量字体 (2)2.1.2 点阵字体 (2)2.1.3 两者的比较 (2)2.2 字符编码 (3)2.2.1 字符存储标准 (3)2.2.2 GB2312标准 (3)2.3 软件 (4)2.3.1 VC++6.0 (4)第三章 Windows编程与MFC基础 (6)3.1 Windows编程基础 (6)3.1.1 Windows API函数 (6)3.1.2 窗口与句柄 (6)3.1.3 事件与消息 (7)3.2 MFC基础 (7)3.2.1 MFC概述 (7)3.2.2 MFC基础类及其层次结构 (8)3.2.3 MFC中的全局函数 (9)3.2.4 入口函数 (9)3.2.5 MFC的消息映射 (9)第四章点阵字体的生成和显示 (11)4.1 提取字体 (11)4.1.1 提取系统的指定矢量字体 (11)4.2 矢量到点阵的字体转换 (11)4.2.1 矢量字体转换为位图 (11)4.2.2 位图转换为点阵字体 (12)4.3 点阵字体的屏幕显示 (12)第五章点阵字体的镶边处理 (14)5.1 镶边的意义 (14)5.2 镶边的方法 (14)5.3 镶边的要求 (14)5.4 镶边算法的设计 (15)5.5 镶边的显示 (16)第六章软件编程实现 (17)6.1 界面制作 (17)6.1.1 界面生成 (17)6.1.2 控件的设置 (17)6.2 点阵字体生成显示模块制作 (19)6.2.1 字体的生成 (19)6.2.2 字体的显示 (20)6.3 镶边模块的制作 (21)6.3.1 字体的镶边 (21)6.4 字库生成载入模块的制作 (22)6.4.1 字库的生成 (23)6.4.2 字库的载入 (24)6.5 各模块的整合 (24)第七章程序的改进和不足 (26)7.1 改进和完善 (26)7.2 程序的不足 (28)结束语 (29)致谢 (30)参考文献 (31)附录 (32)第一章绪论1.1 课题的综述如今,点阵的处理已经被用于各行各业,融入了每个人的生活。

从矢量字库中获取近似汉字点阵

从矢量字库中获取近似汉字点阵

MDN 郭强 + 李维 . 液晶显示应用技术 M>N. 北京 & 北京电子工业
出版社 +DBBB&!
!"# $%%&’()*+#" ,-)."/" ,-+&+0#"& 1’# 2+#&)( 3&’* 4"0#’& 5’.#
字 * 而点阵汉字库是 *./ 时代为了显示汉字的字符 库 +’,( 在 0123456A842@6 目录下面有许多后缀为 @@B 的 文件 * 这些就是矢量字库 * 例如仿宋 CDE’F$’G@@B ) 宋 体 G@@B 等 . 所谓矢量字库 * 其 实就是用点和线来描述图 形字符而组成的字符库 ( 这样 * 在图形需要放大的时
图形图像
从矢量字库中获取近似汉字点阵
严健武
# 广州航海高等专科学校计算机与信息工程系 $ 广州 #$%&’# % 摘 要 & 介绍 如 何从 计 算 机已 安 装 的矢 量 字 库中 $ 在 /01234 53106 78% 环 境下 $ 实 现 将 任 意 字 体 的 汉 字 $ 转换 为 点 阵汉 字 的 的 方 法 $ 使 !"9 显 示 屏 显 示 的 汉 字 的 字 体 不 局 限 于 现 有 的 点 阵字库 ( 关键词 & 矢量字体 ’ 汉字点阵 ’ !"#
!输出汉字到 #$%&’(). ( " 取 得 交 叉 点 颜 色 值 2@)&#+A$& 函 数 B# 以 及 附 加
点阵数据 (
# 模 拟 -. /-. 点 阵 # 重 新 绘 制 点 阵 汉 字 到 C$%0 &’()/2D$ECFGH*$A 函数B$

从矢量字库中获取近似汉字点阵

从矢量字库中获取近似汉字点阵

从矢量字库中获取近似汉字点阵
严健武
【期刊名称】《现代计算机(专业版)》
【年(卷),期】2008(000)006
【摘要】介绍如何从计算机已安装的矢量字库中,在Visual Basic 6.0环境下,实现将任意字体的汉字,转换为点阵汉字的的方法,使LCD显示屏显示的汉字的字体不局限于现有的点阵字库.
【总页数】3页(P84-86)
【作者】严健武
【作者单位】广州航海高等专科学校计算机与信息工程系,广州,510725
【正文语种】中文
【中图分类】TP3
【相关文献】
1.汉字OS字模库中汉字点阵码的提取方法 [J], 杨国松
2.一种从汉字库中快速提取汉字点阵的实现方法 [J], 时永鹏;傅和平
3.不同西文和汉字字库点阵的获取与显示 [J], 顾景文
4.INTERGRAPH CAD系统中的汉字矢量字库及其建立和压缩技术 [J], 陈庆超
5.一个获取汉字16*16点阵数据的方法 [J], 程伟
因版权原因,仅展示原文概要,查看原文内容请购买。

点阵字库表

点阵字库表

纵向取模/*-- 文字: 电 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x1F,0x12,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x12,0x1F,0x00,0x00,0x00, 0x00,0x00,0xE0,0x20,0x20,0x20,0x20,0xFE,0x22,0x22,0x22,0x22,0xE2,0x02,0x0E,0x00,共阳点阵--低电平有效26个英文小写字母的8X16点阵数据abcdefghi前8个位上半屏,后8个位下半屏数据/*-- 文字: a --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0x67,0xDB,0xBB,0xBB,0xBB,0x03,0xFB, /*-- 文字: b --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xE0,0xFF,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0x03,0x7B,0xFB,0xFB,0x77,0x8F,0xFF, /*-- 文字: c --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0x07,0xFB,0xFB,0xFB,0xFB,0x77,0xFF, /*-- 文字: d --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xE0,0xFF,0xFF,0x8F,0x77,0xFB,0xFB,0xFB,0x03,0xFF, /*-- 文字: e --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0x07,0xBB,0xBB,0xBB,0xBB,0x37,0xFF, /*-- 文字: f --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFE,0xFE,0xF0,0xEE,0xEE,0xF6,0xFF,0xFF,0xFF,0xFB,0x03,0xFB,0xFF,0xFF,0xFF, /*-- 文字: g --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xF8,0xF7,0xF7,0xF7,0xF8,0xFF,0xFF,0xFF,0xF7,0x7B,0x7B,0x7B,0x07,0xFF,0xFF, /*-- 文字: h --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xE0,0xFF,0xFE,0xFE,0xFE,0xFF,0xFF,0xFB,0x03,0x7B,0xFF,0xFF,0xFB,0x03,0xFB, /*-- 文字: i --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0xFE,0xFA,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0x03,0xFB,0xFF,0xFF,0xFF, /*-- 文字: j --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0xFF,0xFF,0xFB,0xE8,0xFF,0xFF,0xFF,0xFF,0xF7,0xFB,0xFB,0x03,0xFF,0xFF, /*-- 文字: k --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xE0,0xFF,0xFF,0xFE,0xFE,0xFE,0xFF,0xFB,0x03,0xDB,0xBF,0x4B,0xF3,0xFB,0xFF, /*-- 文字: l --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0xFB,0xFB,0xF3,0xFF,0xFF, /*-- 文字: m --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0x03,0xFF,0xFF,0x03,0xFF,0xFF,0x03,0xFF, /*-- 文字: n --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0x03,0xFF,0xFF,0xFF,0xFF,0x03,0xFF, /*-- 文字: o --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0x07,0xFB,0xFB,0xFB,0xFB,0x07,0xFF, /*-- 文字: p --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0x00,0xFB,0xFB,0xFB,0x77,0x8F,0xFF, /*-- 文字: q --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0x0F,0xF7,0xF7,0xF7,0xF6,0x00,0xFE, /*-- 文字: r --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFE,0xFE,0xFF,0xFE,0xFE,0xFE,0xFF,0xFF,0xFB,0x03,0x7B,0xFB,0xFF,0x7F,0xFF, /*-- 文字: s --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0x33,0xDB,0xDB,0xDB,0xDB,0x67,0xFF, /*-- 文字: t --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFE,0xFE,0xF8,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0xFB,0xFB,0xF3,0xFF, /*-- 文字: u --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0x07,0xFB,0xFB,0xFB,0xFB,0x07,0xFB, /*-- 文字: v --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x0F,0xF7,0xFB,0xF7,0x0F,0xFF,0xFF, /*-- 文字: w --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFE,0xFF,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF,0x07,0xFB,0xE7,0x1F,0xE7,0xFB,0x07,0xFF, /*-- 文字: x --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFE,0xFE,0xFF,0xFF,0xFE,0xFE,0xFF,0xFF,0xFB,0x73,0x8F,0x8F,0x73,0xFB,0xFF, /*-- 文字: y --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFE,0xFE,0xFF,0xFF,0xFF,0xFE,0xFE,0xFF,0xFE,0x7E,0x8E,0xF1,0xE7,0x9F,0x7F,0xFF, /*-- 文字: z --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0x7B,0xF3,0xCB,0xBB,0x7B,0xF3,0xFF, 26个英文大写字母点阵数据/*-- 文字: A --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0xF0,0xEF,0xF0,0xFF,0xFF,0xFF,0xFB,0x03,0xBF,0xBF,0xBF,0x03,0xFB,0xFF, /*-- 文字: B --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xEF,0xE0,0xEE,0xEE,0xEE,0xF1,0xFF,0xFF,0xFB,0x03,0xFB,0xFB,0xFB,0x77,0x8F,0xFF, /*-- 文字: C --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFC,0xF3,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0x1F,0xE7,0xFB,0xFB,0xFB,0xFB,0xE7,0xFF, /*-- 文字: D --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xEF,0xE0,0xEF,0xEF,0xEF,0xF7,0xF8,0xFF,0xFB,0x03,0xFB,0xFB,0xFB,0xF7,0x0F,0xFF, /*-- 文字: E --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xE0,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0x03,0xFB,0xFB,0xFB,0xFB,0xFB,0xFF, /*-- 文字: F --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xEF,0xE0,0xEE,0xEE,0xEE,0xEE,0xEF,0xFF,0xFB,0x03,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,/*-- 文字: G --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xF0,0xEF,0xEF,0xEF,0xEF,0xE7,0xFF,0xFF,0x0F,0xF7,0xFB,0xFB,0xBB,0x87,0xBF,0xFF, /*-- 文字: H --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xEF,0xE0,0xEF,0xFF,0xFF,0xEF,0xE0,0xEF,0xFB,0x03,0x7B,0x7F,0x7F,0x7B,0x03,0xFB, /*-- 文字: I --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xEF,0xEF,0xE0,0xEF,0xEF,0xFF,0xFF,0xFF,0xFB,0xFB,0x03,0xFB,0xFB,0xFF,0xFF, /*-- 文字: J --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0xEF,0xEF,0xE0,0xEF,0xEF,0xFF,0xFC,0xFE,0xFE,0xFE,0x01,0xFF,0xFF,0xFF, /*-- 文字: K --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xEF,0xE0,0xEE,0xFC,0xEB,0xE7,0xEF,0xFF,0xFB,0x03,0xFB,0x7F,0x9B,0xE3,0xFB,0xFF, /*-- 文字: L --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xEF,0xE0,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0x03,0xFB,0xFB,0xFB,0xFB,0xF3,0xFF, /*-- 文字: M --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xE0,0xEF,0xE0,0xFF,0xE0,0xEF,0xE0,0xFF,0x03,0xFF,0xFF,0x03,0xFF,0xFF,0x03,0xFF, /*-- 文字: N --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xEF,0xE0,0xF3,0xFC,0xFF,0xEF,0xE0,0xEF,0xFB,0x03,0xFB,0xFF,0x1F,0xE7,0x03,0xFF, /*-- 文字: O --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xF8,0xF7,0xEF,0xEF,0xEF,0xF7,0xF8,0xFF,0x0F,0xF7,0xFB,0xFB,0xFB,0xF7,0x0F,0xFF, /*-- 文字: P --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xEF,0xE0,0xEF,0xEF,0xEF,0xEF,0xF0,0xFF,0xFB,0x03,0x7B,0x7F,0x7F,0x7F,0xFF,0xFF, /*-- 文字: Q --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xF8,0xF7,0xEF,0xEF,0xEF,0xF7,0xF8,0xFF,0x0F,0xE7,0xDB,0xDB,0xE3,0xF5,0x0D,0xFF, /*-- 文字: R --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xEF,0xE0,0xEE,0xEE,0xEE,0xEE,0xF1,0xFF,0xFB,0x03,0xFB,0xFF,0x3F,0xCF,0xF3,0xFB,/*-- 文字: S --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xF1,0xEE,0xEF,0xEF,0xEF,0xE7,0xFF,0xFF,0xF3,0xFB,0x7B,0x7B,0xBB,0xC7,0xFF, /*-- 文字: T --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xEF,0xEF,0xEF,0xE0,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0x03,0xFF,0xFF,0xFF,0xFF, /*-- 文字: U --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0x07,0xFB,0xFB,0xFB,0xFB,0x07,0xFF, /*-- 文字: V --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xEF,0xE0,0xFF,0xFF,0xFF,0xE0,0xEF,0xFF,0xFF,0x3F,0xCF,0xF3,0xCF,0x3F,0xFF,0xFF, /*-- 文字: W --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xE0,0xFF,0xFF,0xE0,0xFF,0xFF,0xE0,0xFF,0x07,0xFB,0x87,0x7F,0x87,0xFB,0x07,0xFF, /*-- 文字: X --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xEF,0xE7,0xF9,0xFE,0xFE,0xF9,0xE7,0xEF,0xFB,0xF3,0xCF,0x3F,0x3F,0xCF,0xF3,0xFB, /*-- 文字: Y --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0xE3,0xFC,0xFF,0xFC,0xE3,0xFF,0xFF,0xFF,0xFB,0xFB,0x03,0xFB,0xFB,0xFF, /*-- 文字: Z --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xEF,0xEF,0xEF,0xEF,0xEC,0xEB,0xE7,0xFF,0xF3,0xEB,0x9B,0x7B,0xFB,0xFB,0xF3,0xFF,。

怎样把一个汉字的点阵码取出来

怎样把一个汉字的点阵码取出来

怎样把一个汉字的点阵码取出来?我要把汉字显示在LED上我以前回过的一个类似贴/Expert/topic/3453/3453150.xml?temp=.6769373汉字库我用的是UCDOS的HZK16,直接导入了ROM他说的仅仅是取点阵码而已。

用软件就不必说了,那太多了。

用程序来:在一块MemDC上写上汉字,弄到合适大小。

然后GetPixelCDC memDC;CBitmap memBmp;CBitmap *pOldBmp;memDC.CreateDC(...);//创建DC(“画图工具”)//创建“画布”//画布大小为LED点阵大小,用黑白两色的那种画布memBmp.CreateBitmap(...);pOldBmp = memDC.SelectObject(&memBmp);//选择新的画布,保存旧的//还可以新建字体CFont,来创建你需要的字体//...memDC.DrawText(...);//写入文字for(int i=0; i <nWidth; i++)for(int j=0; j <nHeight; j++){if(memDC.GetPixel(i,j) > 0)//好像非0是白色的,0 是黑色的,正好相反{}else{//点亮LED上对应的点}}memDC.SelectObject(pOldBmp);memBmp.DeleteObject();memDC.DeleteDC();听说还有一种方法的,但我只知道大致思路,其实也是系统显示字体的方式,就是根据汉字的内码对系统字库本身进行寻址获取其点阵信息,寻址方式有一定的规律,内码的高低位通过一个公式运算后获得,具体公式忘记了……汉字的区位码和其在汉字库中的偏移量关系如下(HZK16为例):lOffset = ( (区码- 1) * 94L + (位码- 1) ) * 32L汉字点阵与编码-写大字2007-09-25 23:14有关库文件准备:12点阵或者16点阵的汉字库文件.。

用矢量字库在绘图仪上实现汉字输出

用矢量字库在绘图仪上实现汉字输出

用矢量字库在绘图仪上实现汉字输出陈 刚煤科总院常州自动化所(常州213015) T D672 摘要 介绍一种用线板或弧线表示字符笔划的矢量汉字库,在绘图仪上实现汉字输出,其方法要比点阵汉字速度快,简单易行。

主题词 计算机 外部设备 汉字系统 系统软件1 前言在煤矿监控系统中,根据用户要求,常需配置绘图仪来绘制一些瓦斯,一氧化碳曲线,或者打印其它信息,如在我们新开发的信集闭系统中配置了SDR21100型号绘图仪,用以绘制机车运行图。

所用的操作系统是I BM O S 2操作系统,编程语言是V is A ge C++。

该系统为开发者提供了强劲的开发支持,如要在绘图仪上绘制图形,开发者只要用丰富的绘图库函数显示空间绘图,然后把显示空间关联(输出)到某个设备即可在该设备上绘制图形。

但SRD21100绘图驱动程序不支持汉字输出,我们也曾把汉字作为16316点阵位图绘制到显示空间以打印汉字,但绘图仪在绘图时把位图的背景颜色也绘了出来。

如果编制应用程序直接把汉字输出到绘图仪,存在许多问题,主要有:a.必须编制繁琐的绘图仪指控指令,当用其它型号绘图仪时须重新编制;b.破坏了多任务操作系统对外设的调度管理;c.图中的汉字须在一页图绘制完后才能绘制,并需要绘图仪重新走纸及定位;d.点阵汉字是用点在绘图仪上绘出,因此速度很慢。

所以就考虑用矢量汉字来实现绘图。

所谓矢量汉字就是用线段或弧线来表示字符的笔划,在绘制图形时,如遇到汉字可以调用绘图函数把矢量汉字在显示空间绘出。

最后把显示空间与绘图仪相联,由操作系统管理在绘图仪上绘出。

2 矢量汉字库及其驱动程序开发原理与常用的点阵汉字库相比,矢量汉字库的汉字信息主要由描述字型笔划的信息即操作码与一组线段的数据组成。

所以矢量汉字的字型数据不像点阵汉字字型那样有固定的长度,不能通过简单的换算关系求得汉字在汉字库中的地址。

我们采用的A u toCAD下的H ZTXT. SHX矢量汉字库,该文件结构上可以划分为前后两部分(见表1)。

原理——汉字字模提取技术

原理——汉字字模提取技术

随着嵌入式技术的发展, 各类智能电子装置日益增多, 在这 些电子装置中经常需要显示汉字, 如各类由 LED 点阵组成的电子 广告牌与液晶显示屏。LED 点阵显示屏与液晶显示屏都是 以 “点 位 点 亮 ”的 方 式 显 示 , 因 此 在 显 示 汉 字 时 必 须 通 过 某 些 技 术 手 段 获得反映汉字字型点阵数据的汉字字模, 在工程应用中都是借助 个 人 计 算 机 上 的 各 种 字 库 文 件 获 得 汉 字 字 模 。目 前 广 泛 应 用 的 字 库有三类: 点阵字库、矢量字库与 TrueType 字库, 本文将分析各类 字库的组成结构与字模提取技术。
图1 (1)计 算 区 位 码 设汉字机内码的两个字节为 HHLL, 区码 qh, 位码为 wh, 则 有: qh=HH- 0xa0 wh=LL- 0xa0 (2)计 算 汉 字 点 阵 数 据 存 储 位 置 偏 移 量 偏移量是指字模首字节距离文件头的相对位置, 其计算原理 是求出被检索汉字之前的汉字个数再乘每个汉字所占的字节数。 1 个 n×n 点阵字符所占字节数等于 n×n÷8, 如 16×16 点阵占 32 个
1计算区位码设汉字机内码的两个字节为hhll区码qh位码为wh则qhhh0xa0whll0xa02计算汉字点阵数据存储位置偏移量偏移量是指字模首字节距离文件头的相对位置其计算原理是求出被检索汉字之前的汉字个数再乘每个汉字所占的字节数
本栏目责任编辑: 谢媛媛
开发研究与设计技术
汉字字模提取技术
张呈祥 ( 北京信息职业技术学院 自动化工程系, 北京 100016)
参考文献: [1]吴海辉.TrueType 字体技术的研究分析与应用.电脑知识与 技 术 ,2007.1. [2]徐雨明,蒋盛益.UCDOS 曲线轮廓字库的分析.衡阳师范学 院 学 报 ,2000.6. [3]Microsoft Corp.Font and Text Functions.Platform SDK Doc- umentation,MSDN Library- October,2001.

汉字库读取汉字

汉字库读取汉字

在汉字库中寻找某个汉字的点阵数据文章分类:Java编程在计算机中英文可以使用ASCII 码来表示,而汉字使用的是扩展ASCII 码,并且使用两个扩展ASCII 码来表示一个汉字。

一个ASCII 码使用一个字节表示,所谓扩展ASCII 码,也就是ASCII 码的最高位是1的ASCII 码,简单的说就是码值大于等于128 的ASCII 码。

一个汉字由两个扩展ASCII 码组成,第一个扩展ASCII 码用来存放区码,第二个扩展ASCII 码用来存放位码。

在GB2312-80 标准中,将所有的汉字分为94个区,每个区有94个位可以存放94个汉字,形成了人们常说的区位码,这样总共就有94*94=8836 个汉字。

在点阵字库中,汉字点阵数据就是按照这个区位的顺序来存放的,也就是最先存放的是第一个区的汉字点阵数据,在每一个区中有是按照位的顺序来存放的。

在汉字的内码中,汉字区位码的存放实在扩展ASCII 基础上存放的,并且将区码和位码都加上了32,然后存放在两个扩展ASCII 码中。

具体的说就是:第一个扩展ASCII码= 128+32 + 汉字区码第二个扩展ASCII吗= 128+32 + 汉字位码如果用char hz[2]来表示一个汉字,那么我可以计算出这个汉字的区位码为:区码= hz[0] - 128 - 32 = hz[0] - 160位码= hz[1] - 128 - 32 = hz[1] - 160。

这样,我们可以根据区位码在文件中进行殉职了,寻址公式如下:汉字点阵数据在字库文件中的偏移= ((区码-1) * 94 + 位码) * 一个点阵字模占用的字节数在寻址以后,即可读取汉字的点阵数据到缓冲区进行显示了。

以下是实现代码:/* 输出一个汉字的函数*/void _draw_hz(char hz[2], FILE *fp, int x, int y, int w, int h, int color){char fontbuf[128]; /* 足够大的缓冲区,也可以动态分配*/int ch0 = (BYTE)hz[0]-0xA0; /* 区码*/int ch1 = (BYTE)hz[1]-0xA0; /* 位码*//* 计算偏移*/long offset = (long)pf->_hz_buf_size * ((ch0 - 1) * 94 + ch1 - 1);fseek(fp, offset, SEEK_SET); /* 进行寻址*/fread(fontbuf, 1, (w + 7) / 8 * h, fp); /* 读入点阵数据*/_draw_model(fontbuf, w, h, x, y, color); /* 绘制字模*/}以上介绍完了中文点阵字库的原理,当然还有英文点阵字库了。

点阵字库和矢量字库

点阵字库和矢量字库

点阵字库的生产原理(转)2011-05-17 15:31:45| 分类:其他技术| 标签:|字号大中小订阅点阵字库的生产原理所有的汉字或者英文都是下面的原理,由左至右,每8个点占用一个字节,最后不足8个字节的占用一个字节,而且从最高位向最低位排列。

生成的字库说明:(以12×12例子)一个汉字占用字节数:12÷8=1····4也就是占用了2×12=24个字节。

编码排序A0A0→A0FE A1A0→A2FE依次排列。

以12×12字库的“我”为例:“我”的编码为CED2,所以在汉字排在CEH-AOH=2EH区的D2H-A0H=32H个。

所以在12×12字库的起始位置就是[{FE-A0}*2EH+32H]*24=104976开始的24个字节就是我的点阵模。

其他的类推即可。

英文点阵也是如此推理。

在DOS程序中使用点阵字库的方法首先需要理解的是点阵字库是一个数据文件,在这个数据文件里面保存了所有文字的点阵数据.至于什么是点阵,我想我不讲大家都知道的,使用过"文曲星"之类的电子辞典吧,那个的液晶显示器上面显示的汉子就能够明显的看出"点阵"的痕迹.在 PC 机上也是如此,文字也是由点阵来组成了,不同的是,PC机显示器的显示分辨率更高,高到了我们肉眼无法区分的地步,因此"点阵"的痕迹也就不那么明显了.点阵、矩阵、位图这三个概念在本质上是有联系的,从某种程度上来讲,这三个就是同义词.点阵从本质上讲就是单色位图,他使用一个比特来表示一个点,如果这个比特为0,表示某个位置没有点,如果为1表示某个位置有点.矩阵和位图有着密不可分的联系,矩阵其实是位图的数学抽象,是一个二维的阵列.位图就是这种二维的阵列,这个阵列中的 (x,y) 位置上的数据代表的就是对原始图形进行采样量化后的颜色值.但是,另一方面,我们要面对的问题是,计算机中数据的存放都是一维的,线性的.因此,我们需要将二维的数据线性化到一维里面去.通常的做法就是将二维数据按行顺序的存放,这样就线性化到了一维.那么点阵字的数据存放细节到底是怎么样的呢.其实也十分的简单,举个例子最能说明问题.比如说 16*16 的点阵,也就是说每一行有16个点,由于一个点使用一个比特来表示,如果这个比特的值为1,则表示这个位置有点,如果这个比特的值为0,则表示这个位置没有点,那么一行也就需要16个比特,而8个比特就是一个字节,也就是说,这个点阵中,一行的数据需要两个字节来存放.第一行的前八个点的数据存放在点阵数据的第一个字节里面,第一行的后面八个点的数据存放在点阵数据的第二个字节里面,第二行的前八个点的数据存放在点阵数据的第三个字节里面,…,然后后面的就以此类推了.这样我们可以计算出存放一个点阵总共需要32个字节.看看下面这个图形化的例子:| |1| | | | | | | | | | |1| | | || | |1|1| |1|1|1|1|1|1|1|1|1| | || | | |1| | | | | | | | |1| | | ||1| | | | | |1| | | | | |1| | | || |1|1| | | |1| | | | | |1| | | || | |1| | | |1| | | | |1| | | | || | | | |1| | |1| | | |1| | | | || | | |1| | | |1| | |1| | | | | || | |1| | | | | |1| |1| | | | | ||1|1|1| | | | | | |1| | | | | | || | |1| | | | | |1| |1| | | | | || | |1| | | | |1| | | |1| | | | || | |1| | | |1| | | | | |1| | | || | |1| | |1| | | | | | |1|1|1| || | | | |1| | | | | | | | |1| | || | | | | | | | | | | | | | | | |可以看出这是一个"汉"字的点阵,当然文本的方式效果不是很好.根据上面的原则,我们可以写出这个点阵的点阵数据:0x40,0x08,0x37,0xfc,0x10,0x08,…, 当然写这个确实很麻烦所以我不再继续下去.我这样做,也只是为了向你说明,在点阵字库中,每一个点阵的数据就是按照这种方式存放的.当然也存在着不规则的点阵,这里说的不规则,指的是点阵的宽度不是8的倍数,比如12*12 的点阵,那么这样的点阵数据又是如何存放的呢?其实也很简单,每一行的前面8个点存放在一个字节里面,每一行的剩下的4点就使用一个字节来存放,也就是说剩下的4个点将占用一个字节的高4位,而这个字节的低4位没有使用,全部都默认的为零.这样做当然显得有点浪费,不过却能够便于我们进行存放和寻址.对于其他不规则的点阵,也是按照这个原则进行处理的.这样我们可以得出一个 m*n 的点阵所占用的字节数为 (m+7)/8*n.在明白了以上所讲的以后,我们可以写出一个显示一个任意大小的点阵字模的函数,这个函数的功能是输出一个宽度为w,高度为h的字模到屏幕的 (x,y) 坐标出,文字的颜色为color,文字的点阵数据为 pdata 所指:/*输出字模的函数*/void _draw_model(char *pdata, int w, int h, int x, int y, int color){int i; /* 控制行 */int j; /* 控制一行中的8个点 */int k; /* 一行中的第几个"8个点"了 */int nc; /* 到点阵数据的第几个字节了 */int cols; /* 控制列 */BYTE static mask[8]={128, 64, 32, 16, 8, 4, 2, 1}; /* 位屏蔽字 */w = (w + 7) / 8 * 8; /* 重新计算w */nc = 0;for (i=0; i<h; i++){cols = 0;for (k=0; k<w/8; k++){for (j=0; j<8; j++){if (pdata[nc]&mask[j])putpixel(x+cols, y+i, color);cols++;}nc++;}}}代码很简单,不用怎么讲解就能看懂,代码可能不是最优化的,但是应该是最易读懂的.其中的 putpixel 函数,使用的是TC提供的 Graphics 中的画点函数.使用这个函数就可以完成点阵任意大小的点阵字模的输出.接下来的问题就是如何在汉子库中寻址某个汉子的点阵数据了.要解决这个问题,首先需要了解汉字在计算机中是如何表示的.在计算机中英文可以使用 ASCII 码来表示,而汉字使用的是扩展 ASCII 码,并且使用两个扩展 ASCII 码来表示一个汉字.一个 ASCII 码使用一个字节表示,所谓扩展 ASCII 码,也就是 ASCII 码的最高位是1的 ASCII 码,简单的说就是码值大于等于 128 的 ASCII 码.一个汉字由两个扩展 ASCII 码组成,第一个扩展ASCII 码用来存放区码,第二个扩展 ASCII 码用来存放位码.在 GB2312-80 标准中,将所有的汉字分为94个区,每个区有94个位可以存放94个汉字,形成了人们常说的区位码,这样总共就有 94*94=8836 个汉字.在点阵字库中,汉字点阵数据就是按照这个区位的顺序来存放的,也就是最先存放的是第一个区的汉字点阵数据,在每一个区中有是按照位的顺序来存放的.在汉字的内码中,汉字区位码的存放实在扩展 ASCII 基础上存放的,并且将区码和位码都加上了32,然后存放在两个扩展 ASCII 码中.具体的说就是:第一个扩展ASCII码 = 128+32 + 汉字区码第二个扩展ASCII吗 = 128+32 + 汉字位码如果用char hz[2]来表示一个汉字,那么我可以计算出这个汉字的区位码为:区码 = hz[0] - 128 - 32 = hz[0] - 160位码 = hz[1] - 128 - 32 = hz[1] - 160.这样,我们可以根据区位码在文件中进行殉职了,寻址公式如下:汉字点阵数据在字库文件中的偏移 = ((区码-1) * 94 + 位码) * 一个点阵字模占用的字节数在寻址以后,即可读取汉字的点阵数据到缓冲区进行显示了.以下是实现代码:/* 输出一个汉字的函数 */void _draw_hz(char hz[2], FILE *fp, int x, int y, int w, int h, int color){char f ON tbuf[128]; /* 足够大的缓冲区,也可以动态分配 */int ch0 = (BYTE)hz[0]-0xA0; /* 区码 */int ch1 = (BYTE)hz[1]-0xA0; /* 位码 *//* 计算偏移 */long offset = (long)pf->_hz_buf_size * ((ch0 - 1) * 94 + ch1 - 1);fseek(fp, offset, SEEK_SET); /* 进行寻址 */ fread(fontbuf, 1, (w + 7) / 8 * h, fp); /* 读入点阵数据 */ _draw_model(fontbuf, w, h, x, y, color); /* 绘制字模 */}以上介绍完了中文点阵字库的原理,当然还有英文点阵字库了.英文点阵字库中单个点阵字模数据的存放方式与中文是一模一样的,也就是对我们所写的 _draw_model 函数同样可以使用到英文字库中.唯一不同的是对点阵字库的寻址上.英文使用的就是 ASCII 码,其码值是0到127,寻址公式为:英文点阵数据在英文点阵字库中的偏移 = 英文的ASCII码 * 一个英文字模占用的字节数可以看到,区分中英文的关键就是,一个字符是 ASCII 码还是扩展 ASCII 码,如果是ASCII 码,其范围是0到127,这样是使用的英文字库,如果是扩展 ASCII 码,则与其后的另一个扩展 ASCII 码组成汉字内码,使用中文字库进行显示.只要正确区分 ASCII 码的类型并进行分别的处理,也就能实现中英文字符串的混合输出了.点阵字库和矢量字库的差别我们都只知道,各种字符在电脑屏幕上都是以一些点来表示的,因此也叫点阵.最早的字库就是直接把这些点存储起来,就是点阵字库.常见的汉字点阵字库有 16x16, 24x24 等.点阵字库也有很多种,主要区别在于其中存储编码的方式不同.点阵字库的最大缺点就是它是固定分辨率的,也就是每种字库都有固定的大小尺寸,在原始尺寸下使用,效果很好,但如果将其放大或缩小使用,效果就很糟糕了,就会出现我们通常说的锯齿现象.因为需要的字体大小组合有无数种,我们也不可能为每种大小都定义一个点阵字库.于是就出现了矢量字库.矢量字库矢量字库是把每个字符的笔划分解成各种直线和曲线,然后记下这些直线和曲线的参数,在显示的时候,再根据具体的尺寸大小,画出这些线条,就还原了原来的字符.它的好处就是可以随意放大缩小而不失真.而且所需存储量和字符大小无关.矢量字库有很多种,区别在于他们采用的不同数学模型来描述组成字符的线条.常见的矢量字库有 Type1字库和Truetype字库.在点阵字库中,每个字符由一个位图表示(如图2.5所示),并把它用一个称为字符掩膜的矩阵来表示,其中的每个元素都是一位二进制数,如果该位为1表示字符的笔画经过此位,该像素置为字符颜色;如果该位为0,表示字符的笔画不经过此位,该像素置为背景颜色.点阵字符的显示分为两步:首先从字库中将它的位图检索出来,然后将检索到的位图写到帧缓冲器中.在实际应用中,同一个字符有多种字体(如宋体、楷体等),每种字体又有多种大小型号,因此字库的存储空间十分庞大.为了减少存储空间,一般采用压缩技术.矢量字符记录字符的笔画信息而不是整个位图,具有存储空间小,美观、变换方便等优点.例如:在AutoCAD中使用图形实体-形(Shape)-来定义矢量字符,其中,采用了直线和圆弧作为基本的笔画来对矢量字符进行描述. 对于字符的旋转、放大、缩小等几何变换,点阵字符需要对其位图中的每个象素进行变换,而矢量字符则只需要对其几何图素进行变换就可以了,例如:对直线笔画的两个端点进行变换,对圆弧的起点、终点、半径和圆心进行变换等等.矢量字符的显示也分为两步.首先从字库中将它的字符信息.然后取出端点坐标,对其进行适当的几何变换,再根据各端点的标志显示出字符.轮廓字形法是当今国际上最流行的一种字符表示方法,其压缩比大,且能保证字符质量.轮廓字形法采用直线、B样条/Bezier曲线的集合来描述一个字符的轮廓线.轮廓线构成一个或若干个封闭的平面区域.轮廓线定义加上一些指示横宽、竖宽、基点、基线等等控制信息就构成了字符的压缩数据.如何使用Windows的系统字库生成点阵字库?我的程序现在只能预览一个汉字的不同字体的点阵表达.界面很简单: 一个输出点阵大小的选择列表(8x8,16x16,24x24等),一个系统中已有的字体名称列表,一个预览按钮,一块画图显示区域.得到字体列表的方法:(作者称这一段是用来取回系统的字体,然后添加到下拉框中) //取字体名称列表的回调函数,使用前要声明一下该方法int CALLBACK MyEnumF ON tProc(ENUMLOGFONTEX* lpelf,NEWTEXTMETRICEX* lpntm,DWORD nFontType,long lParam){CFontPeekerDlg* pWnd=(CFontPeekerDlg*) lParam;if(pWnd){if( pWnd->m_combo_sfont.Find ST ring(0, lpelf->elfLogFont.lfFaceName) <0 )pWnd->m_combo_sfont.AddString(lpelf->elfLogFont.lfFaceName);return 1;}return 0;}//说明:CFontPeekerDlg 是我的dialog的类名, m_combo_sfont是列表名称下拉combobox关联的control变量//调用的地方 (******问题1:下面那个&lf怎么得到呢……){::EnumFontFamiliesEx((HDC) dc,&lf, (FONTENUMPROC)MyEnumFontProc,(LPARAM) this,0);m_combo_sfont.SetCurSel(0);}字体预览:如果点阵大小选择16,显示的时候就画出16x16个方格.自定义一个类CMyStatic继承自CStatic,用来画图.在CMyStatic的OnPaint()函数中计算并显示.取得字体:常用的方法:用CreateFont创建字体,把字TextOut再用GetPixel()取点存入数组. 缺点:必须把字TextOut出来,能在屏幕上看见,不爽.我的方法,用这个函数:GetGlyphOutline(),可以得到一个字的轮廓矢量或者位图.可以不用textout到屏幕,直接取得字模信息函数原型如下:DWORD GetGlyphOutline(HDC hdc, //画图设备句柄UINT uChar, //将要读取的字符/汉字 UINT uFormat, //返回数据的格式(字的外形轮廓还是字的位图) LPGLYPHMETR ICS lpgm, // GLYPHMETRICS结构地址,输出参数DWORD cbBuffer, //输出数据缓冲区的大小LPVOID lpvBuffer, //输出数据缓冲区的地址CO NS T MAT2 *lpmat2 //转置矩阵的地址);说明:uChar字符需要判断是否是汉字还是英文字符.中文占2个字节长度.lpgm是输出函数,调用GetGlyphOutline()是无须给lpgm 赋值.lpmat2如果不需要转置,将 eM11.value=1; eM22.value=1; 即可.cbBuffer缓冲区的大小,可以先通过调用GetGlyphOutline(……lpgm, 0, NULL, mat); 来取得,然后动态分配lpvBuffer,再一次调用GetGlyphOutline,将信息存到lpvBuffer. 使用完毕后再释放lpvBuffer.程序示例:(***问题2:用这段程序,我获取的字符点阵总都是一样的,不管什么字……)……前面部分省略……GLYPHMETRICS glyph;MAT2 m2;memset(&m2, 0, sizeof(MAT2));m2.eM11.value = 1;m2.eM22.value = 1;//取得buffer的大小DWORD cbBuf = dc.GetGlyphOutline( nChar, GGO_BITMAP, &glyph,0L, NULL, &m2);BYTE* pBuf=NULL;//返回GDI_ERROR表示失败.if( cbBuf != GDI_ERROR ){pBuf = new BYTE[cbBuf];//输出位图GGO_BITMAP 的信息.输出信息4字节(DWORD)对齐dc.GetGlyphOutline( nChar, GGO_BITMAP, &glyph, cbBuf, pBuf, &m2);}else{if(m_pFont!=NULL)delete m_pFont;return;}编程中遇到问题:一开始,GetGlyphOutline总是返回-1,getLastError显示是"无法完成的功能",后来发现是因为调用之前没有给hdc设置Font.后来能取得pBuf信息后,又开始郁闷,因为不太明白bitmap的结果是按什么排列的.后来跟踪汉字"一"来调试(这个字简单),注意到了 glyph.gmBlackBoxX 其实就是输出位图的宽度,glyph.gmBlackBoxY就是高度.如果gmBlackBoxX=15,glyph.gmBlackBoxY=2,表示输出的pBuf中有这些信息:位图有2行信息,每一行使用15 bit来存储信息.例如:我读取"一":glyph.gmBlackBoxX = 0x0e,glyph.gmBlackBoxY=0x2; pBuf长度cbBuf=8 字节pBuf信息: 00 08 00 00 ff fc 00 00字符宽度 0x0e=14 则第一行信息为: 0000 0000 0000 100 (只取到前14位)第二行根据4字节对齐的规则,从0xff开始 1111 1111 1111 110看出"一"字了吗?呵呵直到他的存储之后就可以动手解析输出的信息了.我定义了一个宏#define BIT(n) (1<<(n)) 用来比较每一个位信息时使用后来又遇到了一个问题,就是小头和大头的问题了.在我的机器上是little endian的形式,如果我用unsigned long *lptr = (unsigned long*)pBuf;//j from 0 to 15if( *lptr & BIT(j) ){//这时候如果想用j来表示写1的位数,就错了}因为从字节数组中转化成unsigned long型的时候,数值已经经过转化了,像上例中,实际上是0x0800 在同BIT(j)比较.不多说了,比较之前转化一下就可以了if( htonl(*lptr) & BIT(j) )Unicode中文点阵字库的生成与使用点阵字库包含两部分信息.首先是点阵字库文件头信息,它包含点阵字库文字的字号、多少位表示一个像素,英文字母与符号的size、起始和结束 unicode编码、在文件中的起始偏移,汉字的size、起始和结束unicode编码、在文件中的起始偏移.然后是真实的点阵数据,即一段段二进制串,每一串表示一个字母、符号或汉字的点阵信息.要生成点阵字库必须有文字图形的来源,我的方法是使用ttf字体.ttf字体的显示采用的是SDL_ttf库,这是开源图形库SDL的一个扩展库,它使用的是libfreetype以读取和绘制ttf字体.它提供了一个函数,通过传入一个Unicode编码便能输出相应的文字的带有alpha 通道的位图.那么我们可以扫描这个位图以得到相应文字的点阵信息. 由于带有alpha通道,我们可以在点阵信息中也加入权值,使得点阵字库也有反走样效果.我采用两位来表示一个点,这样会有三级灰度(还有一个表示透明).点阵字库的显示首先需要将文件头信息读取出来,然后根据unicode编码判断在哪个区间内,然后用unicode编码减去此区间的起始unicode编码,算出相对偏移,并加上此区间的文件起始偏移得到文件的绝对偏移,然后读出相应位数的数据,最后通过扫描这段二进制串,在屏幕的相应位置输出点阵字型.显示点阵字体需要频繁读取文件,因此最好做一个固定大小的缓存,采用LRU置换算法维护此缓存,以减少磁盘读取.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图形图像
从矢量字库中获取近似汉字点阵
严健武
# 广州航海高等专科学校计算机与信息工程系 $ 广州 #$%&’# % 摘 要 & 介绍 如 何从 计 算 机已 安 装 的矢 量 字 库中 $ 在 /01234 53106 78% 环 境下 $ 实 现 将 任 意 字 体 的 汉 字 $ 转换 为 点 阵汉 字 的 的 方 法 $ 使 !"9 显 示 屏 显 示 的 汉 字 的 字 体 不 局 限 于 现 有 的 点 阵字库 ( 关键词 & 矢量字体 ’ 汉字点阵 ’ !"#
!
引 言
()* 电子显示屏广泛应用于银行 ) 医院 ) 车站 ) 股
和窗体 84;K 一样可以在控件内绘制图形和输出文字 的控件 * 它可以按照设置的字体 ) 字型和字号 * 以及前 景色和背景色来输出汉字 ( +1I@<;=E4J 控件提供了绘 制点 ) 线 ) 形状的方法 * 并且可以读取 +1I@<;=E4J 控件 中每一个点 -L *M%的颜色值 ( 所以 *+1I@<;=E4J 控件是 读取汉字的点阵数据的一个理想场所 ( 当汉字输出到 +1I@<;=E4J 控件后 * 由于它还是一 个矢量汉字 *如何把该汉字的点阵数据按找单片机系 统 ()* 显示屏点阵格式读取出来呢 . 比较下面两个 图N
字 * 而点阵汉字库是 *./ 时代为了显示汉字的字符 库 +’,( 在 0123456A842@6 目录下面有许多后缀为 @@B 的 文件 * 这些就是矢量字库 * 例如仿宋 CDE’F$’G@@B ) 宋 体 G@@B 等 . 所谓矢量字库 * 其 实就是用点和线来描述图 形字符而组成的字符库 ( 这样 * 在图形需要放大的时
参考文献
Picture1.FillColor = vbRed Picture1.Circle (XX$ yy)$ Picture1.TextWidth("0") / 2 $ vbRed Else Picture1.ForeColor = vbYellow Picture1.FillColor = vbBlack Picture1.Circle (XX$ yy)$ Picture1.TextWidth("0") / 2 $ vbYellow End If XX = XX + Picture1.TextWidth("0") Next yy = yy + CInt(Picture1.TextHeight("1") / 2) Next End Sub
!输出汉字到 #$%&’(). ( " 取 得 交 叉 点 颜 色 值 2@)&#+A$& 函 数 B# 以 及 附 加
点阵数据 (
# 模 拟 -. /-. 点 阵 # 重 新 绘 制 点 阵 汉 字 到 C$%0 &’()/2D$ECFGH*$A 函数B$
以下给出全部源代码 # 其中 @)&#+$A& 是读点阵函 数 #I$ECFGH*$A 是将读取的点阵数据模拟 JKI 显示屏 上 的 显 示 L# 在 6 读 点 阵 8 按 钮 中 先 后 调 用 @)&#+A$&< 和
现 代 计 算 机 ! 总 第 二 八 五 期 "
候 * 只要把所有这个图形的点和线放大相应的倍数就 可以了 ( 这就是为什么在编辑软件中 * 选用任意的字 体尺寸 * 汉字笔划还是与放大前那样连贯 ( 而点阵汉 字 * 直接放大之后 * 将出现严重的失真 (
E4J 控件的 9高度 :/9宽度 :的点阵数据 ( 这样 *点阵数据
随 0123456 操 作系统的出现而出现了一种更好的 字 库*它就是矢量字库 7789$:( 778 是 7;<= 7>?= 842@ 的简 称( 而丰富的 778 中字体却无法直接使用到在 ()* 电 子显示板上显示 ( 通过本文介绍的方法 * 可以把任意
778 中字体的汉字转换为点阵汉字* 从而在使 ()* 电
"
点阵数据生成具体实现
为了说明问题 #程序简化如图 ! 界面 <
-. 等份 # 然后定义一个 -./-. 的点阵数组 # 保存交叉
点 的 颜 色 值.如 果 交 叉 点 的 数 据 为 红 色 #则 数 组 单 元 为 /#否则为 0$ 经过实践 #得到如下的结果 ’
图 ! 程序界面
实现步骤 ’
图 - 方正新舒体简体 %-. 号大小 & 图 1 方正新舒体简体
新建 =* 工程 # 在窗体 >+(?/ 上按图 ! 排列好控 件$
2-./-. 点阵数据 3
其 中 图 - 是 选 择 的 是 -. 号 方 正 新 舒 体 简 体 字 体 ( 图 1 的数据来自保存在 -./-. 的点阵数组变量中 的 数 据 #根 据 数 组 单 元 的 值 为 /%红 色 &还 是 为 0%黑 色 &#打印出来的模拟 -./-. 点阵的圆点点阵 $ 可见 # 读出来的点阵数据 #和矢量字库中的字体非常接近 $
充 $ 附加点阵是这样的一个数组 ’在横向和纵向 #同样 把 #$%&’()*+, 控件划分成 -./-. 等份 # 但起始点的位 置与第一次划分时错开 6 点阵数 7!891 个点 #! 在这里 是修正系数 #是经过实践测试出来的最佳值 $ 本程序 同时采用两种方法 #测试结果是使的任意字体的汉字
票交易所的信息显示 * 其显示的汉字 * 一般来自 点阵 字库 * 而 +) 时代点阵字库也只有寥寥几个 &$’/$’ 和
$"/$" 的宋体 *’,/’, 仿宋或者宋体 ( 因此一般 ()* 显
示屏上的汉字字体比较单调 ( 而点阵字库可以在 -)0
*./ 软件中找到 *其汉字点阵数据读取非常容易实现 (
现 代 计 算 机 ! 总 第 二 八 五 期 "

! " # $ % & ’ "! ( ) * + % ,--!."
" !
图形图像
P=0 For j = 0 To dz - 1 For i = 0 To dz - 1 ArrWord (0 $ P) = iif (Picture1.Point (i * dfx$ j * dfy) = vbRed$1 $0) If Picture1.Point (i * dfx$ j * dfy + dfy / (dz / 8)) = vbRed Then ArrWord2(P) = 1 If Picture1.Point (i * dfx + dfx / (dz / 8)$ j * dfy) = vbRed Then ArrWord3(P) = 1 P=P+1 Next Next For i = 0 To dz * dz - 1 If ArrWord2(i) = 1 or ArrWord3(i) = 1 Then ArrWord(0 $ i) = 1 Next End Sub Sub displayBin() yy = 0:XX = 0 Picture1.Cls For k = 0 To dz * dz - 1 Step dz XX = 0 For j = k To k + dz Picture1.CurrentX = XX:Picture1.CurrentY = yy If ArrWord(0 $ j) = 1 Then Picture1.ForeColor = vbRed '
;
结 语
利用 EK 从矢量字库中建立高点阵汉字库的一种
方法 $ 在实践中有效可行 ( 点阵数越高 )DL 或以上 *+ 字形越接近矢量字形 ’ 而对于低点阵汉字数据 + 失真 度要采取其他更有效的办法来控制 ,
MANO(?1 ;(0).11. 文本图像文件格式转换 M>N. 北京 & 北京学苑
出版社 +APP@&AD
可以读取出来 *但又不常用的点阵格式 (
#
矢量字库汉字点阵的读取分析
在 HE "G% 标准的控件中 *+1I@<;=E4J 控件是唯一
()* 显 示 点 阵 汉 字 格 式 常 用 的 有 &$" /$" 点 阵 * ’,/’, 点阵 *F’/F’ 点阵和 ,!P,! 点阵 . 以 F’/F’ 点阵
!
点阵数据的修正
当采取上面的方法读取汉字时 # 有可能发生红色
区域的汉字笔划并不在交叉点之内 # 那么该点笔划就 无法还原出来 #如图 "$
D$ECFGH*$A 函数即可 $
Dim ArrWord() As Integer ' 交叉点点阵数组 Dim ArrWord2() As Integer ' 横向辅助数组 Dim ArrWord3() As Integer ' 纵向辅助数组 Dim dz As Integer ' 点阵大小 Private Sub GetPonit() Dim dfx As Integer# dfy As Integer # i As Integer# j As In- teger dz = Mid(Combo2.Text# 1# 2) Picture1.Cls Picture1.FontSize = Mid(Combo2.Text# 1 # 2) * 2 Picture1.FontName = Combo1.Text Picture1.FontBold = True:Picture1.ForeColor = vbRed:Pic- ture1.Print Text1 Picture1.Width = Picture1.TextWidth(" 汉 ") Picture1.Height = Picture1.TextHeight(" 汉 ") dfx = Picture1.ScaleWidth / dz:dfy = Picture1.ScaleHeight / dz ReDim ArrWord (1 # dz * dz)#ArrWord2 (dz * dz)#Ar- rWord3(dz * dz)
相关文档
最新文档