字模的原理和获取

合集下载

img2lcd 字模提取原理

img2lcd 字模提取原理

img2lcd 字模提取原理
哎呀,你这问题可有点意思啊,要用四川话、陕西话、还有北京话混合着来回答。

那我就试试看,咱们先聊聊这img2lcd字模提取原理吧。

咱们先从四川话开始。

说起这个img2lcd,那可不简单哦,它的原理就像咱们四川的火锅一样,得一层层地揭开才能看到里面的好东西。

你要先有个图片,就像火锅里得有各种食材一样,然后img2lcd就能帮你把这个图片里的字模给提取出来,就像火锅里把食材煮熟了捞出来一样。

再来说说陕西话。

陕西的汉子们都知道,咱这地方讲究实在。

img2lcd字模提取原理也是这么回事,你得实实在在地给它一个图片,它才能实实在在地给你提取出字模来。

这原理就像咱陕西的黄土高原一样,你得脚踏实地,才能看到它的真实面貌。

最后咱们来聊聊北京话。

在北京,人们讲究的是个明白。

img2lcd字模提取原理就是让你明白,原来图片里的字模可以这么简单地提取出来。

就像北京的四合院一样,看似复杂,其实结构清晰,一目了然。

所以说啊,这个img2lcd字模提取原理,就像咱们各地的方言一样,各有各的特色,但都是为了让人更好地理解和使用。

不管你是四川人、陕西人还是北京人,都能通过这个原理,轻松地把图片里的字模提取出来。

这就是它的神奇之处,也是它的魅力所在。

汉字字模提取技术

汉字字模提取技术
K y r s D t txc aatr e wo d o r h rce ma i Ve tr o t co n f T u T p n AP n t n r e y ef t o I u ci s f o
随着嵌 入式技术 的发展 , 各类智能 电子装置 日益增多 , 在这
pi t n o t f i e o oio vr t o n l p n il,o ot u eet ci e o s n l - l a o i e o t mps i o a aiy fo t e r cpe t f t fh r t nm t d dr a c i p n ov w n h c t n f e f f i i n o ot x a o h a et e c n l e. dt h o g s e o i
每个汉字 的字模生 成后 , 照区位码的顺序存储构成 点阵 阵 占 3 个 字 节 。 按 2 字库 文件 。使 用时需要打开字库文件 , 通过一定方法计算 出某 个汉 字字模 的存 储位置 ,然后从 该位置读 出若 干字节 的点 阵 数据 。
1计 算 区位 码 、 设 汉 字机 内码 的两 个 字 节 为 H L , H L 区码 q , 码 为 w , h位 h则
1 阵 字模 , 个 点 阵 由 2 6个 点 组 成 , 行 切 分 每 行 1 6点 每 5 按 6位 占
个 字 节 为 ( 6进 制 )0 07 4 FF 08 0A 。 1 :0 88 4 E5 05 O 8
2 计算汉字点阵数据存储位置偏移量 、
偏 移 量 是 指 字模 首 字 节距 离 文 件 头 的相 对 位 置 ,其 计 算原

个 n Xn的点阵字符 ,其生成方法就是 在一个具有 nXn 个小

字库中存放的汉字是汉字的字模

字库中存放的汉字是汉字的字模

字库中存放的汉字是汉字的字模
【最新版】
目录
1.汉字字模的定义与作用
2.汉字字模的分类与存储方式
3.汉字字模的应用领域及其重要性
正文
汉字字模是指用于打印、显示和传输汉字的一种编码方式,它是汉字在计算机中的表示形式。

汉字字模对于汉字的传播和应用具有重要意义,因为它让汉字能够在不同的设备和系统中实现统一的显示和打印效果。

汉字字模可以分为两类:矢量字模和位图字模。

矢量字模是一种基于数学方程根据字体特点描绘出的字形,它具有字形精确、放大后不失真的特点。

位图字模则是将汉字分解成若干个像素点,形成一幅图像来表示汉字,它具有字形较为粗糙、放大后失真的特点。

这两种字模各有优缺点,根据不同的应用场景选择合适的字模。

汉字字模通常存储在字库中,字库是计算机系统中存放汉字字模的数据库。

字库中的汉字字模按照一定的编码顺序排列,方便计算机在需要时快速调用。

除了字库,汉字字模还可以通过其他方式进行存储和传输,例如将字模嵌入到图片或 PDF 文件中。

汉字字模在许多领域都有广泛应用,如印刷、广告、计算机屏幕显示、手机输入法等。

有了汉字字模,计算机系统才能够正确地显示和打印汉字,保证信息的准确传递。

此外,汉字字模还为字体设计师提供了创作空间,使得各种风格的字体层出不穷,丰富了汉字的表现形式。

总之,汉字字模作为汉字在计算机中的表示形式,对于汉字的传播和应用具有重要意义。

字符取模原理

字符取模原理

字符取模原理字符取模原理是计算机科学中的一个重要概念,它在数据处理和编程中有着广泛的应用。

本文将介绍字符取模原理的基本概念、应用场景以及相关的注意事项。

一、概念字符取模是指将字符转换为对应的数值,一般使用ASCII码或Unicode码来表示字符。

在计算机中,每个字符都有一个唯一的编码值,通过这个编码值可以对字符进行处理和操作。

字符取模的原理是通过对字符的编码值进行取模运算,将其映射到一个特定的范围内,得到一个与字符相关的数值。

二、应用场景1. 字符映射:字符取模可用于将字符映射到特定的索引或位置,常用于编码表、字典等数据结构的实现。

例如,可以使用字符取模将字母映射到26个英文字母的索引位置,方便进行字母表的排序和查找。

2. 散列函数:字符取模可以作为散列函数的一种实现方式,将字符串映射到一个固定大小的散列表中。

通过对字符串的每个字符进行取模运算,可以将字符串均匀地散列到散列表的不同位置,提高散列算法的效率和均匀性。

3. 数据分片:在分布式系统中,字符取模可以用于将数据分片到不同的节点上。

通过对数据的某个唯一标识(如用户ID、订单ID等)进行取模运算,可以将数据均匀地分配到不同的节点上,实现数据的负载均衡和并行处理。

4. 循环队列:字符取模还可以用于实现循环队列。

通过对队列的下标进行取模运算,可以将队列的头尾连接起来,实现循环利用队列空间的效果。

循环队列常用于缓冲区的实现,提高数据读写的效率。

三、注意事项1. 取模运算的基数要与映射范围的大小相匹配,以保证映射结果的准确性。

例如,如果要将字符映射到0-25的范围内,可以使用取模运算基数为26。

2. 字符取模的结果可能存在冲突,即不同的字符可能映射到相同的数值。

为了避免冲突,可以采用更复杂的映射算法,如哈希函数,或者增加冲突解决的策略,如链表法、开放寻址法等。

3. 字符取模的性能与映射范围的大小有关,映射范围越大,冲突的可能性越小,但计算开销也会增加。

汉字字模存储和提取的方法

汉字字模存储和提取的方法

汉字字模存储和提取的方法
汉字字模的存储和提取是汉字信息处理系统中的重要环节,常用的方法有以下几种:
1. 存储在程序存储器中:这是在程序不大或单片机无外部扩展数据存储区功能的情况下使用的方法。

2. 通过外扩的EEPROM存储汉字字模数据:采用哈佛结构的单片机,如8051单片机及其派生产品,程序存储器(ROM)和数据存储器(RAM)可分别寻址。

将提取的汉字字模数据存放在EPROM或EEPROM内,并设定该芯片的片选地址,只要知道某个汉字字模数据在该芯片的存储位置,通过程序计算出偏移地址,即可实现显示功能。

3. 使用外扩的EEPROM存储整个汉字库:某些高端单片机,如Motorola 的M68300系列32位单片机,寻址范围可达8M。

以上信息仅供参考,如有需要,建议查阅计算机科学和电子工程相关书籍或咨询专业人士。

字模的制作方法

字模的制作方法

字模的制作方法一、字模的制作原理字模是指把文字字形进行分离,重新形成的离散的,一般指印刷机用来印刷不同字形的模具叫做字模,字模分为字母模、汉字模、数字模等。

字模在印刷行业中有着广泛的应用,通常有几种方式可以制作字模,即金属字模、塑料字模、复合字模等。

金属字模:金属字模由圆钢或硬质合金精加工制作,它的特点是精度高,耐磨损,耐腐蚀,机械强度高,耐眩光、耐热,特别适合长期大量印刷,但成本较高。

塑料字模:塑料字模采用特种大分子聚氨酯加工,具有质地柔软,精度可达到明见线,耐磨损,耐腐蚀,耐眩光,耐低温,耐水性佳,使用寿命长等优点,不过价格较贵。

复合字模:复合字模由特殊的塑料聚氨酯和金属材料制成,可以满足特殊的印刷要求,特别是显英文字母和汉字笔画较复杂的文字,具有价格便宜、精度高、耐磨损、耐眩光、耐水性佳、耐低温等优点。

二、字模的制作方法1、先确定印刷文字种类、字体、文字大小和印刷纸张尺寸,及确定字模材料,以确保最终产品的质量。

2、绘制文字的字模图,将文字的字形画出来,以便最后有一个清晰的字模来指导制作。

3、按字模图来数孔,先制作一个图样,再按照图样来进行数孔,以确保字模的精度。

4、按文字图案胶上印刷模板,然后用钻床机将图案根据设定的孔数把字模切割出来。

5、完成后,用砂轮机将字模磨平,再检查是否完成,最后放入仓库,以备日后用。

三、注意事项1、制作字模时,设备、工具和材料都需要精准,以确保字模的尺寸准确,防止印刷后出现下垂;2、印刷模板的品质要求,是文字图案要清晰,色彩鲜艳,可以采用凹版印刷或凸版印刷;3、为了保证字模的精度,制作过程中要严格按照步骤操作,不可擅自更改。

4、制作字模之前,应先认真审核要制作的文字,以免出现意外的错误。

字模提取详细解读

字模提取详细解读

/*打开字库文件 asc16*/ if((ASC=fopen("asc16","rb"))==NULL){ printf("Can't open asc,Please add it?"); getch(); exit(0); } offset = *(c)*16+1; fseek(ASC,offset,SEEK_SET); fread(buff, 16, 1, ASC); /*通过 ascii 码算出偏移量*/ /*将文件指针移动到偏移量的位置*/ /*从偏移量的位置读取32个字节*/
英文字模的信息,我们就先得到这个字符的 ASCII 码。 以得到字符"A"的字模信息为例: 假如我们要得到的字母 A 的字模信息,我们得到"A"的 ASCII 值为 65,我们就 可以算出字符"A"的字模信息在 ASC16文件中的偏移量=(65*16)+1=1041字 节(注意这个数字,我们将在后面用程序进行验证),我们只需要从 ASC16文件 中1041字节开始读取16个字节就可以得到 "A"的字模信息了。
#include "stdio.h"
/********************************** * 得到英文字符的字模信息,存入数组 * 参数:
* *
*c:要得到字模信息的字符指针 buffer[]:存储得到字模信息的数组
* 无返回值 ***********************************/ void getAscCode(char *c,char buff[]) { unsigned long offset; FILE *ASC;

字符取模原理

字符取模原理

字符取模原理字符取模原理是指将一个字符转化为对应的ASCII码,再对某个数值取模的过程。

在计算机中,字符是以ASCII码的形式存储和表示的。

ASCII码是一个由128个字符组成的编码系统,每个字符对应一个唯一的数值。

在字符取模原理中,首先需要将字符转化为对应的ASCII码。

ASCII 码表中,每个字符都有一个唯一的数值表示。

例如,字符'A'的ASCII码为65,字符'a'的ASCII码为97。

通过查表或使用编程语言中的函数,可以将一个字符转化为对应的ASCII码。

接下来,需要选择一个数值作为取模的基数。

取模的基数可以是任意整数,常见的有10、100、256等。

选择不同的基数会对结果产生不同的影响。

然后,将字符的ASCII码与基数进行取模运算。

取模运算的结果是一个非负整数,范围从0到基数-1。

例如,如果基数为10,字符'A'的ASCII码65对10取模的结果是5,字符'a'的ASCII码97对10取模的结果是7。

通过字符取模原理,我们可以实现一些有趣的功能。

例如,可以根据字符的ASCII码判断字符的类型。

在ASCII码中,数字字符的范围是48到57,大写字母字符的范围是65到90,小写字母字符的范围是97到122。

通过对字符的ASCII码进行取模运算,可以判断字符属于哪个范围,从而确定字符的类型。

字符取模原理还可以用于实现简单的加密算法。

通过对字符的ASCII码进行取模运算,可以将原文中的字符转化为一系列新的字符。

只有知道取模的基数和算法,才能还原出原始的字符。

这样可以增加信息的安全性,防止未经授权的人查看或修改数据。

除了上述应用,字符取模原理还可以用于生成随机数。

通过对字符的ASCII码进行取模运算,可以得到一个随机的非负整数。

通过在取模运算之前,对字符进行加密或者加盐处理,可以进一步增加随机性,生成更加安全的随机数。

字符取模原理是将字符转化为对应的ASCII码,再对某个数值取模的过程。

活字印刷的原理

活字印刷的原理

活字印刷的原理
活字印刷是一种传统的印刷技术,其原理是使用可重复使用的金属或木质字符来印刷文字和图像。

活字印刷的原理可以概括为以下几个步骤:
1. 字模制作:首先需要制作可重复使用的字模。

字模可以用金属或木质制成,制作时需要将字形雕刻在字模表面。

每个字的字模单独制作,可以根据需要组合成任意的文字和图像。

2. 墨水涂布:印刷前,需要将墨水均匀地涂布在字模表面。

墨水通常是油性墨水,可以在字模表面形成一层薄薄的墨膜。

3. 印刷过程:当字模表面涂有墨水后,将纸张放置在字模上方。

然后,应用压力(通常是通过印刷机的滚轮或脚踏来实现)使字模与纸张密切接触,墨膜便会被转移到纸张上。

4. 重复使用:印刷完成后,纸张被取下,字模上的墨膜会随之消失。

字模可以再次用于印刷其他文字和图像,以实现高效的大量印刷。

活字印刷的原理简单但高效,因此在印刷技术发展之前长期被广泛应用。

由于其每个字符单独制作和组合的特点,可以快速灵活地进行排版和印刷。

尽管现代印刷技术已经取代了活字印刷,但活字印刷依然被视为一项有价值的文化传统和艺术形式。

字符取模原理

字符取模原理

字符取模原理字符取模原理解析什么是字符取模字符取模是一种常见的编程技巧,用于判断字符串中某个字符在另一个字符集合中是否存在。

利用字符取模可以快速判断某个字符是否包含在一个字符串中,以及计算出字符在字符串中的位置。

字符取模的原理字符取模的原理基于ASCII码表,每个字符都对应一个唯一的ASCII码,范围从0到127。

通过将字符串中的字符与字符集合进行比较,可以根据字符的ASCII码判断字符是否存在于字符集合中。

字符取模的步骤1.将字符串和字符集合转换为ASCII码形式。

2.遍历字符串中的每个字符,并获取字符的ASCII码。

3.检查字符ASCII码是否包含在字符集合的ASCII码范围内。

4.如果包含,则表示字符存在于字符集合中;否则,表示字符不存在于字符集合中。

字符取模的示例以下是一个使用字符取模技巧判断字符串中是否包含某个字符的示例代码:def is_character_exists(string, character):# 获取字符集合的ASCII码character_set = set(ord(c) for c in string)# 获取字符的ASCII码char_ascii = ord(character)# 判断字符是否存在于字符集合中if char_ascii in character_set:return Trueelse:return False字符取模的优势和适用场景字符取模是一种高效的算法,可以快速判断一个字符是否存在于字符串中。

相比于遍历字符串逐个比较字符的方法,字符取模可以大大提高执行效率。

字符取模适用于以下场景: - 判断字符串中是否包含某个特定的字符。

- 在字符串中查找某个字符并获取其位置。

- 对字符串中的字符进行去重操作。

总结字符取模是一种利用字符的ASCII码进行快速判断字符是否存在于字符串中的编程技巧。

它遵循将字符串和字符集合转换为ASCII码,通过比较字符的ASCII码范围来判断字符是否存在的原理。

lcd字符取模逻辑

lcd字符取模逻辑

lcd字符取模逻辑lcd字符取模是一种将字符转化为点阵的处理方法,在很多嵌入式设备、计算机和其他显示屏上被广泛应用。

它的原理是通过对字符进行网格化处理,将每个字符转化为一系列亮与不亮的点,以便于在显示屏上显示。

要了解lcd字符取模的原理,我们首先需要了解字符表示的基本概念。

在计算机中,每个字符都由一定数量的像素点组成。

传统的字库是由点阵字模组成,每个点代表一个像素的状态,可以是亮或者不亮。

而lcd字符取模就是将这些字模组合起来,形成对应的字符。

lcd字符取模的过程可以分为两个主要部分:网格化处理和字模转换。

网格化处理是将字符转化为一个个网格,即将字符按照像素点的形式显示出来。

这里使用的常见网格大小是5*7和8*8,也有其他的大小。

在网格中,每个点都可以表示为一个二进制数,其中1表示亮点,0表示不亮点。

字符的每一行可以用一个字节来表示,将所有行拼接起来,就形成了完整的字符图像。

字模转换是将网格化处理后的字符转化为可以在lcd屏幕上显示的形式。

这一步需要将字模转换为lcd驱动器所需的命令格式,通常是通过位操作将每个字节的相应位设置为1或者0。

通过字模转换,我们可以将字符显示在lcd上的任意位置,并设置字符的大小、亮度等属性。

lcd字符取模不仅可以将字符显示在lcd屏幕上,还可以通过组合不同的字符来显示图形、图标和其他形状。

它具有灵活性和可扩展性,适用于各种显示需求。

在实际应用中,lcd字符取模可以广泛应用于各种嵌入式设备、电子产品和计算机界面中。

例如,在数字表盘中,lcd字符取模可以将数字转化为点阵,通过点阵显示出数字的形状。

在计算器和手机屏幕中,lcd字符取模可以将各种字符、符号和图标显示出来,提供更丰富的显示效果。

总之,lcd字符取模是一种将字符转化为点阵的处理方法,广泛应用于各种嵌入式设备和计算机显示界面中。

它的原理是通过网格化处理和字模转换,将字符转化为可以在lcd屏幕上显示的形式。

通过lcd 字符取模,我们可以方便地在显示屏上显示各种字符、符号和图形,为用户提供更丰富、更直观的显示效果。

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

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

随着嵌入式技术的发展, 各类智能电子装置日益增多, 在这 些电子装置中经常需要显示汉字, 如各类由 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.

字模提取原理

字模提取原理

5.7点阵字模生成原理与方法[3]5.7.1 字模生成原理本设计中因为使用汉字的点阵显示,需要提取汉字字模,因此我们首先来了解汉字点阵字模的提取方法。

汉字的点阵字模是从点阵字库文件中提取出来的。

例如常用的16×16点阵HZK16文件,12×12点阵HZK12文件等等,这些文件包括了GB 2312字符集中的所有汉字。

现在只要弄清汉字点阵在字库文件中的格式,就可以按照自己的意愿去显示汉字了。

下面以HZK16文件为例,分析取得汉字点阵字模的方法。

HZK16文件是按照GB 2312-80标准,也就是通常所说的国标码或区位码的标准排列的。

国标码分为 94 个区(Section),每个区 94个位(Position),所以也称为区位码。

其中01~09 区为符号、数字区,16~87 区为汉字区。

而 10~15 区、88~94 区是空白区域。

如何取得汉字的区位码呢?在计算机处理汉字和ASCII字符时,使每个ASCII字符占用1个字节,而一个汉字占用两个字节,其值称为汉字的内码。

其中第一个字节的值为区号加上32(20H),第二个字节的值为位号加上32(20H)。

为了与ASCII字符区别开,表示汉字的两个字节的最高位都是1,也就是两个字节的值都又加上了128(80H)。

这样,通过汉字的内码,就可以计算出汉字的区位码。

具体算式如下:qh=c1-32-128=c1-160 wh=c2-32-128=c2-160或qh=c1-0xa0 wh=c2-0xa0qh,wh为汉字的区号和位号,c1,c2为汉字的第一字节和第二字节。

根据区号和位号可以得到汉字字模在文件中的位置:location=(94*(qh-1)+(wh-1))*一个点阵字模的字节数。

那么一个点阵字模究竟占用多少字节数呢?我们来分析一下汉字字模的具体排列方式。

例如下图中显示的“汉”字,使用16×16点阵。

字模中每一点使用一个二进制位(Bit)表示,如果是1,则说明此处有点,若是0,则说明没有。

汉字取模原理

汉字取模原理

汉字的取模原理手工取模原理(详解)因本人这个取模原理也搞了一天,网上也没有现成的资料,包括纵向和横向取模,对照网上各位所说慢慢摸索,最终把原理搞清楚,最后写出来给大家参照一下。

这里,我们先以英文和中文来说明,说明前我们先统一标准。

标准1:显示大小为16*16,显示的像素为1,不显示的为0。

标准2:显示大小为16*16,显示的像素为0,不显示的为1.有的显示要“字节倒序”,主要是显示器的要求不一样。

这里我们用标准1.解说以下图片:1.英文”A”字的取模,我们这里采用横向,横向取模为“高位在左”,方式是按单片机的内存每一位的排列,排列方式为“7.6.5.4.3.2.1.0”,显示的为1,不显示的为0,这里文字大小采用小4,占用像素为8*16。

1.1.我们按图把要显示的字用“1”填起来,图片显示为用1做的“A”,再把没有显示的用“0”填起来。

1.2.我们从Y轴的16行到Y轴第1行,一行一行的取,取8位二进制码,每行方向从左到右取数,再把二进制码用“8421”码转换成16进制码,分别是。

二进制汇编十六进制C语言十六进制Y轴第16行00000000B 00H 0X00Y轴第15行00000000B 00H 0X00Y轴第14行00000000B 00H 0X00Y轴第13行00010000B 10H 0X10Y轴第12行00010000B 10H 0X10Y轴第11行00011000B 18H 0X18Y轴第10行00101000B 28H 0X28Y轴第9行00101000B 28H 0X28Y轴第8行00100100B 24H 0X24Y轴第7行00111100B 3CH 0X3CY轴第6行01000100B 44H 0X44Y轴第5行01000010B 42H 0X42Y轴第4行01000010B 42H 0X42Y轴第3行11100111B 0E7H 0XE7Y轴第2行00000000B 00H 0X00Y轴第1行00000000B 00H 0X00整理汇编为; DB 00H,00H,00H,10H,10H,18H,28H,28H,24H,3CH,44H,42H,42H,0E7H,00H,00H1.3.英文的纵向取模,纵向取模的高位在下。

字模提取

字模提取

基于Qt4.5的Unicode字模提取工具一、关于字模提取的方式。

制作字模提取工具的原理,其实方法都大同小异。

就我所查阅的资料来看,提取字模主要有以下几种方法:1、从字模库中直接提取。

该方法受限于字模库,比如你需要16*16的字模和20*20的字模,你就必须去找到这2个字模库。

2、从ttf库中直接提取。

该方法提取出来的字模很光滑,效果很好。

同样你需要一个ttf库,它是矢量的,可以支持不同的大小。

3、在内存的位图上画出文字,然后生成字模。

该方法写出来的程序不需要额外的字库文件,依赖于操作系统中的字体。

但是一般操作系统中都带有大量的字体,足够我们使用,还可以很自由的选择自己喜欢的字体、大小等等。

所以我决定使用第3种方法来制作工具。

二、关于Qt4.5。

采用Qt4.5来制作该工具的最主要的原因是它可以编写跨平台的代码,其次是我正在学习Qt,学以致用才是王道。

另外Qt内部全采用unicode的编码,且提供了其他编码转unicode的良好支持,它同样提供了非常方便的设备上下文的绘图操作,可以方便的完成文字在内存中的绘制和提取字模的工作。

三、关于网上的同类软件。

目前在网上能搜到很多字模提取的工具和方法,大部分都介绍如何从中文的字模库中提取出字模用于嵌入式设备上LCD屏的显示。

其次大多工具都是基于VC开发,无法做到跨平台且基本上都没有开放源代码,有时候需要定制生成字库的文件格式,只有自己实现。

四、关于一些技术细节。

1、Qt的绘图操作。

Qt绘图使用的类是QPainter,使用该类在QWidget上绘图时,需要重载void QWidget::paintEvent ( QPaintEvent * event ) [virtual protected]并在此函数中进行绘图操作,在其他地方使用QPainter直接对QWidgets绘图会出现错误:QPainter::begin: Widget painting can only begin as a result of a paintEvent如果不是直接对QWidget绘图,而是在内存中建立一个位图,选入设备,然后在位图上绘图,则没有该限制。

字模的原理和获取

字模的原理和获取
字模获取工具的制作
分析过字模的原理后,就可以来编写工具,首先要准备字库文件,HZK16.DAT,可以从网上下载。
根据原理,先打开文件,然后根据汉字的内码获取区码和位码,然后根据区吗和位码索引到文件中的地址,再读取32个字节数据到BUFFER中即大功告成。
下面是VC中的一段代码,供参考:
view plaincopy to clipboardprint?
HZK16文件是按照GB 2312-80标准,也就是通常所说的国标码或区位码的标准排列的。国标码分为94个区(Section),每个区94个位(Position),所以也称为区位码。其中01~09区为符号、数字区,16~87区为汉字区。而10~15区、88~94区是空白区域。
如何取得汉字的区位码呢?在计算机处理汉字和ASCII字符时,使每个ASCII字符占用1个字节,而一个汉字占用两个字节,其值称为汉字的内码。其中第一个字节的值为区号加上32(20H),第二个字节的值为位号加上32(20H)。为了与ASCII字符区别开,表示汉字的两个字节的最高位都是1,也就是两个字节的值都又加上了128(80H)。这样,通过汉字的内码,就可以计算出汉字的区位码。
}
else //是汉字,则直接转换
{
AnsiCode[1]=m_strFont.GetAt(1);
}
qh=AnsiCode[0]-160; //区码和位码
wh=AnsiCode[1]-160;
location=(94*(qh-1)+(wh-1))*32; //HZK16中的索引32是一个字的字模字节数
fp=fopen("HZK16.dat","r");
if(fp==NULL)
{

点阵字模生成原理与方法[3]

点阵字模生成原理与方法[3]

5.7点阵字模生成原理与方法[3]5.7.1 字模生成原理本设计中因为使用汉字的点阵显示,需要提取汉字字模,因此我们首先来了解汉字点阵字模的提取方法。

汉字的点阵字模是从点阵字库文件中提取出来的。

例如常用的16×16点阵HZK16文件,12×12点阵HZK12文件等等,这些文件包括了GB 2312字符集中的所有汉字。

现在只要弄清汉字点阵在字库文件中的格式,就可以按照自己的意愿去显示汉字了。

下面以HZK16文件为例,分析取得汉字点阵字模的方法。

HZK16文件是按照GB 2312-80标准,也就是通常所说的国标码或区位码的标准排列的。

国标码分为 94 个区(Section),每个区 94个位(Position),所以也称为区位码。

其中01~09 区为符号、数字区,16~87 区为汉字区。

而 10~15 区、88~94 区是空白区域。

如何取得汉字的区位码呢?在计算机处理汉字和ASCII字符时,使每个ASCII字符占用1个字节,而一个汉字占用两个字节,其值称为汉字的内码。

其中第一个字节的值为区号加上32(20H),第二个字节的值为位号加上32(20H)。

为了与ASCII字符区别开,表示汉字的两个字节的最高位都是1,也就是两个字节的值都又加上了128(80H)。

这样,通过汉字的内码,就可以计算出汉字的区位码。

具体算式如下:qh=c1-32-128=c1-160 wh=c2-32-128=c2-160或qh=c1-0xa0 wh=c2-0xa0qh,wh为汉字的区号和位号,c1,c2为汉字的第一字节和第二字节。

根据区号和位号可以得到汉字字模在文件中的位置:location=(94*(qh-1)+(wh-1))*一个点阵字模的字节数。

那么一个点阵字模究竟占用多少字节数呢?我们来分析一下汉字字模的具体排列方式。

例如下图中显示的“汉”字,使用16×16点阵。

字模中每一点使用一个二进制位(Bit)表示,如果是1,则说明此处有点,若是0,则说明没有。

QT实现文字取模的原理

QT实现文字取模的原理

QT实现⽂字取模的原理配合POVLED上下位机⼯作还需要⼀个软件⽤于将需要显⽰的图形的位模形⽣成,分为⽂字和图⽚,在这⾥我们先讲解下⽂字字模的取法。

在QT中图⽚使⽤功能QImage类存储,⼜⽀持很多种数据格式,Format_ARGB32,等格式,像这种格式每个像素需要32位数据存储,第⼀字节是透明度,红⾊,绿⾊,蓝⾊。

实现该功能的基本原理是将⽬标⽂字写到16x16像素的图⽚中,⽩底⿊字,然后通过遍历图⽚像素,将像素底⾊⽩⾊为0,⿊⾊为1,存储到⽬标数组中,⼀个汉字可以⽣成 32 byte数组。

具体实现代码mainWidget::mainWidget(QWidget *parent): QWidget(parent){paintArea = new PaintArea;pLineEdit = new QLineEdit;pTextBrower = new QTextBrowser;pPushButton = new QPushButton;//pinputString = new QString;pLineEdit->setFixedWidth(500);pLineEdit->setFixedHeight(25);pPushButton->setText("确定");pPushButton->setFixedHeight(25);rightLayout = new QGridLayout;rightLayout->addWidget(pLineEdit,0,0);rightLayout->addWidget(pPushButton,0,1);rightLayout->addWidget(pTextBrower,1,0);QHBoxLayout *mainLayout = new QHBoxLayout(this);mainLayout->addWidget(paintArea);mainLayout->addLayout(rightLayout);mainLayout->setStretchFactor(paintArea,0);mainLayout->setStretchFactor(rightLayout,1);connect(pPushButton,SIGNAL(clicked()),this,SLOT(pushbutton_clicked()));}mainWidget::~mainWidget(){}void mainWidget::pushbutton_clicked(){qDebug() << "button clocked";qDebug() << pLineEdit->text();pinputString = pLineEdit->text();qDebug() << QString(pinputString[0]);qDebug() << QString(pinputString[1]);qDebug() << pinputString.size();QSize size(16,16);QImage image(size,QImage::Format_ARGB32);image.fill(Qt::white);QPainter painter(&image);painter.setCompositionMode(QPainter::CompositionMode_SourceOver);QPen ppen = painter.pen();ppen.setColor(Qt::black);QFont pfont = painter.font();pfont.setBold(true);pfont.setPixelSize(16);painter.setPen(ppen);painter.setFont(pfont);painter.drawText(image.rect(),Qt::AlignLeft | Qt::AlignVCenter,QString(pinputString[0]));image.save("C:/Users/Administrator/Desktop/LED_ARY/build-codeary-Desktop_Qt_5_9_9_MinGW_32bit-Debug/debug/myImage.png");uchar hziCode[32];uint hanzicode = 0;for(unsigned char i = 0;i < 16;i++){hanzicode = 0;for(unsigned char j = 0;j < 16; j++){hanzicode <<= 1;if(image.pixel(i,j) == 0xff000000){hanzicode |= 1;}}//qDebug("%",hanzicode);qDebug("%s",qPrintable(QString::number(hanzicode,2).rightJustified(16,'0')));hziCode[2*i] = uchar(hanzicode >>8);hziCode[2*i+1] =uchar( hanzicode);qDebug("%s%s",qPrintable(QString::number( hziCode[2*i],2).rightJustified(8,'0')),qPrintable(QString::number(hziCode[2*i+1],2).rightJustified(8,'0')));//qDebug(";;;");}}。

汉字字模读取程序ZM的原理与实现

汉字字模读取程序ZM的原理与实现

汉字字模读取程序ZM的原理与实现
苏少卿;陈力进
【期刊名称】《计算机应用与软件》
【年(卷),期】1994(011)001
【摘要】本文提供了一个汉字字模读取程序ZM。

利用ZM程序生成的字模数据,可以在应用程序中方便地实现西文DOS下的汉字显示功能,而不必借助于中文操作系统,也无需附带汉字库或其它内存驻留程序,从而有效地节约程序内存和磁盘空间资源。

ZM为在西文DOS下实现汉字显示提供了一个简捷方法,是建立友善的人机界面的有效工具,有广泛的应用价值。

【总页数】5页(P46-49,63)
【作者】苏少卿;陈力进
【作者单位】不详;不详
【正文语种】中文
【中图分类】TP317
【相关文献】
1.单片机源程序自动生成汉字字模表 [J], 刘树志;李德深
2.矢量汉字读取的算法及汉字输出的实现方法 [J], 王彤
3.利用VC++实现汉字字模的提取与小汉字库的生成 [J], 王保华
4.汉字字模转换的实用程序 [J], 蒋健;李庆华
5.高点阵汉字读取函数库DISCLIB的原理及实现 [J], 解凯;管伟光
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HZK16文件是按照GB 2312-80标准,也就是通常所说的国标码或区位码的标准排列的。国标码分为94个区(Section),每个区94个位(Position),所以也称为区位码。其中01~09区为符号、数字区,16~87区为汉字区。而10~15区、88~94区是空白区域。
如何取得汉字的区位码呢?在计算机处理汉字和ASCII字符时,使每个ASCII字符占用1个字节,而一个汉字占用两个字节,其值称为汉字的内码。其中第一个字节的值为区号加上32(20H),第二个字节的值为位号加上32(20H)。为了与ASCII字符区别开,表示汉字的两个字节的最高位都是1,也就是两个字节的值都又加上了128(80H)。这样,通过汉字的内码,就可以计算出汉字的区位码。
if(AnsiCode[0]<160) //英文字母和字符,转换为全角的字符内码
{
BYTE temp=AnsiCode[0];
AnsiCode[0]=HIBYTE(temp-0x21+0xA3A1); //0xA3A1是ASCII码为0X21的字符对应的全角字符的内码,这是一个偏移量的计算
AnsiCode[1]=LOBYTE(temp-0x21+0xA3A1);
字模获取工具的制作
分析过字模的原理后,就可以来编写工具,首先要准备字库文件,HZK16.DAT,可以从网上下载。
根据原理,先打开文件,然后根据汉字的内码获取区码和位码,然后根据区吗和位码索引到文件中的地址,再读取32个字节数据到BUFFER中即大功告成。
下面是VC中的一段代码,供参考:
view plaincopy to clipboardprint?
一、什么是字模
单片机应用经常会用到液晶显示模块,是用点阵的方式显示的,要显示汉字或字符的时候会用到字模,字模就是字在点阵上显示时对应的编码,如图1显示的“正”字,使用16×16点阵。点阵中黄色的点是高亮的,对应于二进制编码中的1,绿色的低亮对应于二进制编码中的0。如第一行二进制编码应该是00000000 00001000刚好用两个字节表示就是0x0,0x08,这样,16总共需要用32个字节来表示,这32个字节就是“正”的字模。在单片机程序中,将字模发送给液晶显示模块,就能够显示出响应的汉字或字符。
}
上面获取的汉字,默认是宋体的,假如对字体有要求,就要选用相应字体的字库。当然,大多数时候在液晶上显示是不会在乎字体的,可能看习惯了,感觉宋体最适合点阵显示了。
本文来自CSDN博客,转载请标明出处:file:///C:/Documents%20and%20Settings/Administrator/桌面/公司工作内容/开发文档资料/字模的原理和获取(一)%20-%20起步%20-%20CSDN博客.htm
}
else //是汉字,则直接转换
{
AnsiCode[1]=m_strFont.GetAt(1);
}
qh=AnsiCode[0]-160; //区码和位码
wh=AnsiCode[1]-160;
location=(94*(qh-1)+(wh-1))*32; //HZK16中的索引32是一个字的字模字节数
void CFontDlg::GetGridFromHZK16()
{
UpdateData();
BYTE AnsiCode[2];
BYTE qh,wh;
UINT location;
// BYTE buffer[32];
FILE* fp;
AnsiCode[0]=m_strFont.GetAt(0);//将对话框中的字符转换为内码,先读取第一个字节,判断是汉字还是字母或字符
fp=fopen("HZK16.dat","r");
if(fp==NULL)
{
MessageBox("文件打开错误");
return;
}
else
{
//fseek(fp,location,SEEK_SET);
//fread(buffer,1,32,fp);
fseek(fp,location,SEEK_SET); //定位到指定地方,然后读取
fp=fopen("HZK16.dat","r");
if(fp==NULL)
{
MessageBox("文件打开错误");
return;
}
else
{
//fseek(fp,location,SEEK_SET);
//fread(buffer,1,32,fp);
fseek(fp,location,SEEK_SET); //定位到指定地方,然后读取
具体算式如下:
qh=c1-32-128=c1-160 wh=c2-32-128=c2-160

qh=c1-0xa0 wh=c2-0xa0
qh,wh为汉字的区号和位号,c1,c2为汉字的第一字节和第二字节。
根据区号和位号可以得到汉字字模在文件中的位置:
location=(94*(qh-1)+(wh-1))*一个点阵字模的字节数。
}
void CFontDlg::GetGridFromHZK16()
{
UpdateData();
BYTE AnsiCode[2];
BYTE qh,wh;
UINT location;
//BYTE buffer[32];
FILE* fp;
AnsiCode[0]=m_strFont.GetAt(0);//将对话框中的字符转换为内码,先读取第一个字节,判断是汉字还是字母或字符
fread(buffer,1,16,fp);
fseek(fp,location+16,SEEK_SET);
fread(buffer+16,1,16,fp); //读两次,不知为什么读一次时有些字会出错,比如"家"
fclose(fp);
}
FontCodeToGridBuffer();
SetDlgItemText(IDC_EDIT_FONTCODE,"");
二、字模的获取
汉字的点阵字模是从点阵字库文件中提取出来的。例如常用的16×16点阵HZK16文件,12×12点阵HZK12文件等等,这些文件包括了GB 2312字符集中的所有汉字。现在只要弄清汉字点阵在字库文件中的格式,就可以按照自己的意愿去显示汉字了。
下面以HZK16文件为例,分析取得汉字点阵字模的方法。
if(AnsiCode[0]<160) //英文字母和字符,转换为全角的字符内码
{
BYTE temp=AnsiCode[0];
AnsiCode[0]=HIBYTE(temp-0x21+0xA3A1); //0xA3A1是ASCII码为0X21的字符对应的全角字符的内码,这是一个偏移量的计算
Ansiቤተ መጻሕፍቲ ባይዱode[1]=LOBYTE(temp-0x21+0xA3A1);
}
else //是汉字,则直接转换
{
AnsiCode[1]=m_strFont.GetAt(1);
}
qh=AnsiCode[0]-160; //区码和位码
wh=AnsiCode[1]-160;
location=(94*(qh-1)+(wh-1))*32; //HZK16中的索引32是一个字的字模字节数
上面计算过,一个16×16点阵的汉字总共需要16*16/8=32个字节表示。字模的表示顺序为:先从左到右,再从上到下,也就是先画左上方的8个点,再是右上方的8个点,然后是第二行左边8个点,右边8个点,依此类推,画满16×16个点。
对于其它点阵字库文件,则也是使用类似的方法进行显示。例如HZK12,但是HZK12文件的格式有些特别,如果你将它的字模当作12*12位计算的话,根本无法正常显示汉字。因为字库设计者为了使用的方便,字模每行的位数均补齐为8的整数倍,于是实际该字库的位长度是16*12,每个字模大小为24字节,虽然每行都多出了4位,但这4位都是0(不显示),并不影响显示效果。还有UCDOS下的HZK24S(宋体)、HZK24K(楷体)或HZK24H(黑体)这些打印字库文件,每个字模占用24*24/8=72字节,不过这类大字模汉字库为了打印的方便,将字模都放倒了,所以在显示时要注意把横纵方向颠倒过来就可以了。
fread(buffer,1,16,fp);
fseek(fp,location+16,SEEK_SET);
fread(buffer+16,1,16,fp); //读两次,不知为什么读一次时有些字会出错,比如"家"
fclose(fp);
}
FontCodeToGridBuffer();
SetDlgItemText(IDC_EDIT_FONTCODE,"");
相关文档
最新文档