点阵字库表
中文点阵字库的使用方法(安富莱电子)
中文点阵字库的使用方法安富莱电子 armfly2010-01-03在嵌入式设备LCD上显示的汉字大多数都属于点阵汉字。
常用的点阵字库来自UCDOS。
大家可以去网上下载一个UCDOS的完全安装版本,里面可以找到很多点阵字库文件。
下面几个字库文件是常用的:HZK12 : 12点阵汉字库(宽度x高度 = 12x12)ASC12 : 12点阵ASCII字库(宽度x高度 = 6x12)HZK16 : 16点阵汉字库(宽度x高度 = 16x16) 最常用的中文字库ASC16 : 16点阵ASCII字库(宽度x高度 = 8x16)最常用的ASCII字库HZK24 : 24点阵汉字库(宽度x高度 = 24x24)票据打印机用得较多UCDOS的字库排列标准符合国标一、二级字库标准,即GB2312,汉字个数为6000多个。
按照汉语拼音顺序排列,前面一部分是一级常用汉字大约2000多个,后面一部分是二级汉字大约4000多个。
大多数情况下,一二级字库就可以满足我们的需求。
但是在某些特殊应用(比如显示每个人的姓名)中可能需要用到GB18030字库,该字库除了包括一、二级字库外还包含很多不常用的汉字,总汉字个数为27538个。
安富莱STM32F103ZE-EK开发板配套的光盘上收录一个16点阵的GB18030字库(由于授权问题,这个字库不对外开放)。
下面是GB18030字库点阵的截图。
这个放大的汉字就是二级字库中最后一个汉字,这个字后面的汉字就属于GB18030特有的汉字了。
估计大多数人一个都不认识。
我们来看看GB18030字库最后区域的汉字长得啥样子。
汉字点阵在汉字库中的地址计算公式汉字库种类繁多,但都是按照区位的顺序排列的。
前一个字节为该汉字的区号,后一个字节为该字的位号。
每一个区记录94个汉字,位号则为该字在该区中的位置。
计算公式为: (94*(区号-1)+位号-1) * 一个汉字字模占用字节数对于16点阵的字库,1个汉字字模占用32字节。
点阵字库表
纵向取模/*-- 文字: 电 --*//*-- 宋体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,。
汉字点阵字库原理详解+例程
汉字点阵字库原理一、汉字编码1. 区位码在国标GD2312—80 中规定,所有的国标汉字及符号分配在一个94 行、94 列的方阵中,方阵的每一行称为一个“区”,编号为01 区到94 区,每一列称为一个“位”,编号为01 位到94位,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉伯数字就是它们的“区位码”。
区位码的前两位是它的区号,后两位是它的位号。
用区位码就可以唯一地确定一个汉字或符号,反过来说,任何一个汉字或符号也都对应着一个唯一的区位码。
汉字“母”字的区位码是3624,表明它在方阵的36 区24 位,问号“?”的区位码为0331,则它在03区3l位。
一级汉字16-55区二级汉字56-87区三级汉字1-9区空闲未用10-15区2. 机内码汉字机内码,又称“汉字ASCII码”,简称“内码”,汉字的机内码是指在计算机中表示一个汉字的编码。
机内码与区位码稍有区别。
如上所述,汉字区位码的区码和位码的取值均在1~94 之间,如直接用区位码作为机内码,就会与基本ASCII码混淆。
为了避免机内码与基本ASCII码的冲突,需要避开基本ASCII码中的控制码(00H~1FH),还需与基本ASCII码中的字符相区别。
为了实现这两点,可以先在区码和位码分别加上20H,在此基础上再加80H(此处“H”表示前两位数字为十六进制数)。
经过这些处理,用机内码表示一个汉字需要占两个字节,分别称为高位字节和低位字节,这两位字节的机内码按如下规则表示:高位字节= 区码+ 20H + 80H(或区码+ A0H)低位字节= 位码+ 20H + 80H(或位码+ AOH)由于汉字的区码与位码的取值范围的十六进制数均为01H~5EH(即十进制的01~94),所以汉字的高位字节与低位字节的取值范围则为A1H~FEH(即十进制的161~254)。
例如,汉字“啊”的区位码为1601,区码和位码分别用十六进制表示即为1001H,它的机内码的高位字节为B0H,低位字节为A1H,机内码就是B0A1H。
标准点阵字库芯片
标准点阵字库芯片
GT2X系列标准点阵字库芯片,以其专业性和高性价比,满足市场上各种点阵汉字显示需求。
芯片汉字库内容含国家信标委授权,各种型号分别包含GB2312基本集;GB18030大字符集;UNICODE; BIG5繁体;日文;150国外文等不同大小(12、16、24、32)点阵字库;及3.3V和5V等不同型号。
分别提供SPI串行接口和精简地址并行接口,免除了字库烧录工序和损耗。
GT2X系列标准点阵字库芯片产品列表
GT2X系列标准点阵字库芯片选型推荐表
GT2X系列字库芯片排置格式
GT2X系列字库芯片产品命名规则
GT20系列
GT21系列
GT23系列。
8×8LED点阵显示汉字
的内围范 素像 652 在示显以可也 �字汉示显以可仅不屏字汉个这上实事。像图 幅一为解理形字的字个一每把而�素像个一为解理点个一每把以可们我 。示表来 每由均字个一每的中库字汉标国即 。示显成组阵点的列 61 行 61 由字个一每
图例字取 2-2 图
。形图何任
阵点 652 由均字个一每的中库字汉标国即 。示显成组阵点的列 61 Байду номын сангаас 61 由字个一
狗门看清�时延
狗门看清�时延 ”东“字汉示显
”油“字汉示显
狗门看清�时延
狗门看清�时延
屏阵点清
”石“字汉示显
DEL 化始初
始开
计设程课统系制控的机片单
8
图试调 1-4 图
成完列一第。列排下往上由,亮点时”东“字汉示显,70p 到 00p 为向方。口 70p— 00p 的列 0 第即 �8 列一第角上左是的示显先首机片单在 。成组阵点 8×8 由字汉 故�位 8 为线总的机片单于由�制控机片单 A160ECPS 的位 8 用�析分果结 石北东“示显上屏示显在�理原作工的示显阵点 DEL8×8 据根�果结验实 。一统相求要验实和否是断判 �象现的示显管码数据根 �箱验实到序程载下.7 响影免以�针引有所的 7PJ 和 3PJ 开断意注�路电接连图接连件硬照按.6 。llA dliubeR.5 。序程写编图程流序程照按.4 以可后加添� ”seliF daeH“的程工到 cni.A160ECPS、h.A160ECPS 加添.3 。元单址地者或量变的明申中件文头个两这用接直 。到找 。据数示显出输 。果效验实到达�间时段一续持能并�字汉个六”学大油
序程个整。求要验实合符字汉态动个各�字汉态动示显序顺间时据根�字汉个六
图程流序程主 1.3
标准点阵汉字字库芯片GT21L16T1W
字型: 15X16点阵汉字字符集:GB12345、BIG5基本集日文字符集:JIS0208、兼容Unicode内码多国文字:拉丁文、基里尔文、阿拉伯文等150国 排置方式:横置横排总线接口:SPI串行总线访问速度:SPI时钟频率 30MHz(max.) @3.3V 工作电压:2.7V~3.6V工作电流:12mA待机电流:10uA芯片形式:SO8封装和COG安装1 概述GT21L16T1W 是一款15X16点阵字库芯片,支持GB12345国标繁体汉字(含国家信标委合法授权)、BIG5基本集汉字、JIS0208 日文字符集(兼容Unicode内码)及150国文字。
排列格式为横置横排。
用户通过字符内码,利用本手册提供的方法计算出该字符点阵在芯片中的地址,可从该地址连续读出字符点阵信息。
1.1 芯片特点●数据总线:SPI 串行总线接口 ● 点阵排列方式:字节横置横排 ● 时钟频率:30MHz(max.) @3.3V ● 工作电压:2.7V~3.6V ● 电流:工作电流:12mA 待机电流:10uA ● 封装:SOP8 ● 尺寸(SOP8):4.90mmX3.90mm (193milX154mil ) ● 工作温度:-20℃~85℃(可以提供-40℃~85℃标准字库芯片)1.2 芯片内容分类字库内容编码体系(字符集) 字符数16点阵GB12345标准点阵字库GB12345 6866+846 汉字及字符16点阵BIG5基本集点阵字库BIG5 5401+408 日文及字符 16点阵JIS0208点阵字库JIS0208 6398+16445X7点ASCII 字符 ASCII 96 7X8点ASCII 字符 ASCII 96 6X12点ASCII 字符ASCII 96 8X16点ASCII 字符ASCII 96 8X16点粗体ASCII 字符ASCII 96 12点阵不等宽ASCII 方头(Arial )字符 ASCII 96 ASCII 字符 16点阵不等宽ASCII 方头(Arial )字符 ASCII 96 8X16点拉丁文系字符 Unicode 376 8X16点希腊文系字符 Unicode 96 8X16点基里尔文系字符Unicode 250 12点阵不等宽Unicode 字符(拉丁文系、希腊文系、基里尔文系)Unicode 555 16点阵不等宽Unicode 字符(拉丁文系、希腊文系、基里尔文系)Unicode 555 12点阵不等宽阿拉伯文系字符 Unicode 25012点阵不等宽阿拉伯文系变体字符 自定义498 16点阵不等宽阿拉伯文系字符Unicode 250Unicode 多国字符16点阵不等宽阿拉伯文系变体字符 自定义498 BIG5汉字内码字符索引表BIG5 JIS0208日文内码字符索引表JIS0208 内码索引表 Unicode 日文内码字符索引表UnicodeCS#SO VCC HOLD#NC GNDSCLK SI150国文字简表文系语言国家拉丁文国家文系国家英语 英国、美国等 39国 法语 法国、尼日尔等 22国 西班牙语 西班牙、墨西哥等 22国 葡萄牙语 葡萄牙、巴西等 7国 德语 德国、奥地利等 5国 意大利语 意大利、圣马力诺等 3国 马来语 马来西亚、文莱等 2国 斯瓦希里语 坦桑尼亚、肯尼亚等 2国 拉丁文系 其他拉丁语 荷兰、瑞典等 10国 112国阿拉伯文系 阿拉伯语 埃及、约旦等 21国 基里尔文系 12种语言 俄罗斯、哈萨克等 15国 希腊文系 希腊语 希腊、塞浦路斯 2国合计150国字型样张GB12345汉字 BIG5汉字JIS0208字符拉丁字符 希腊字符 基里尔字符阿拉伯字符 6X12 点ASCII 8X16 点ASCII5x7 点ASCII 7x8 点ASCII2 引脚描述与接口连接2.1 引脚描述SOP8 名称I/O 描述片选输入(Chip enable input)1 CS# I串行数据输出(Serial data output)2 SO O3 NC 悬空4 GND 地(Ground)串行数据输入(Serial data input)5 SI I串行时钟输入(Serial clock input)6 SCLK I总线挂起(Hold, to pause the device without)7 HOLD# I8 VCC 电源(+ 3.3V Power Supply)串行数据输出(SO):该信号用来把数据从芯片串行输出,数据在时钟的下降沿移出。
UCDOS中的点阵字库HZK12
UCDOS中的点阵字库HZK12,HZK16,HZK24,ASC12,ASC16[转]2009年03月10日星期二 13:40如何在嵌入式系统中使用大量的汉字和字符呢?DOS前辈们经过艰辛的努力,将制作好的字模放到了一个个标准的库中以免去后辈的麻烦,这就是点阵字库文件。
一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。
不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。
虽然汉字库种类繁多,但都是按照区位的顺序排列的。
前一个字节为该汉字的区号,后一个字节为该字的位号。
每一个区记录94个汉字,位号则为该字在该区中的位置。
因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。
减1是因为数组是以0为开始而区号位号是以1为开始的。
这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。
以16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1))*32。
汉字库文该从该位置起的32字节信息即记录了该字的字模信息。
☆打印字库文件和HZK12如果你有UCDOS的HZK24S(宋体)、HZK24K(楷体)或HZK24H (黑体),你还可以使用不同字体的大字模汉字了。
HZK24系列是24*24的点阵字库,每字模占用3*24字节。
如果你按照HZK16的显示方法的话,你会看到......呵呵,字被放倒了。
这是因为该类字库与一般的汉字库不同,这类大字模汉字库是专供打印的打印字库,为了打印的方便将字模都放倒了,你使用时,只要将字模的位信息纵横转置显示即可。
例如你如果定义为mat[24][3]则应该这样输出:for(i=0;i<24;i++)for(j=0;j<24;j++)if((0x80>>i%8)&mat[j][i/8]) /*转置显示*/putpixel(j+x,y+i,color);还有一类字库HZK12,虽然属于标准字库类型,但如果你将它的字模当作12*12位计算的话,根本无法正常显示汉字。
15X16点阵标准字库
GT21L16S1W-S15X16点阵标准汉字字库芯片(SPI接口)用户手册VER 2.512006-Q2版本修订记录版本号修改内容日期备注V2.5 生成数据手册2006-6V2.51 修正了扩展字符区的8X16ASCII对应传统ASCII的算法2006-8目录1 概述 (4)2 特点 (5)3 引脚配置 (7)4 引脚描述与接口连接 (7)4.1 引脚描述 (7)4.2 HOST CPU主机SPI接口电路示意图 (8)5 操作指令 (9)5.1 指令参数 (9)5.2 Read Data Bytes(一般读取) (9)5.3 Read Data Bytes at Higher Speed(快速读取点阵数据) (10)6 电气特性 (11)6.1 绝对最大额定值 (11)6.2 DC特性 (11)6.3 AC特性 (11)7 封装尺寸 (13)8 功能描述 (14)8.1 汉字点阵排列格式 (14)8.1.1 15X16点汉字排列格式-横置横排 (14)8.1.2 5X7点ASCII字符排列格式 (14)8.1.3 8X16点ASCII扩展字符排列格式 (15)8.1.4 Unicode字符排列格式 (15)8.1.5 16点阵ASCII方头字符排列格式 (15)8.2 汉字点阵字库结构 (17)8.3 汉字点阵在芯片中的地址计算方法 (18)8.3.1 15X16汉字点阵地址的计算 (18)8.3.2 5X7 ASCII 字符地址的计算 (19)8.3.3 8X16 ASCII 扩展字符地址的计算 (19)8.3.4 16点阵ASCII方头字符在芯片中的字节地址的计算方法如下: (19)8.3.5 8X16 自定义特殊字符地址的计算 (20)8.3.6 8X16 自定义希腊字符区地址的计算 (20)8.3.7 8X16 拉丁语、西里尔语Unicode字符在芯片中的字节地址的计算方法 (20)9 附录 (21)9.1 GB2312 1区(字符区) (21)9.2 Unicode字符区字符 (24)9.3 8×16点扩展字符区ASCII字符(126字符) (29)9.4 5×7点ASCII字符(96字符) (30)9.5 8×16自定义特殊字符区ASCII字符(64字符) (31)9.6 8×16自定义希腊字符区ASCII字符(16字符) (31)9.7 国家语言文系对照表 (32)1 概述GT21L16S1W-S是一款支持GB2312字符集(6763字)的15X16点阵字库SPI串行接口芯片,排列格式为横置横排。
点阵字库
点阵字库一. 什么是点阵字库?我们先了解什么是点阵,简单的说,点阵就是一幅位图。
一般默认都指单色位图,即它是用一个bit表示一个点(像素);其实还有灰阶点阵字库(抗锯齿)和彩色点阵字库(绚丽,但不实用),即多个bit表示一个点(像素)。
点阵字库是指多个(>=1)字符的点阵信息的集合,亦可理解为位图组合。
二. 编码格式目前主要分内码字库和Unicode字库。
(之前项目中应用的是GBK的内码字库,如果要显示日文则无能为力了,目前引入了UNICODE的点阵字库,解决了多语言显示的问题。
)三. 存储格式目前主要分为“Not Fixed” 和“Height Fixed”。
Not Fixed:自适应宽高。
Height Fixed:等高非等宽。
Not Fixed Height Fixed四. 输出格式输出格式是将字符点阵信息以不同的方式存放,反应给用户。
(目前修改使用的是bin输出格式,当然这是指个名字)五.增加日语等多国语言显示工作流程六.字库生成工具及示例步骤说明:如上图示,分5 步。
1. 选择矢量字库文件(*.ttf)或bdf 格式文件(.bdf).A.先将c:\windows\fonts 目录下的字体文件拷贝(ctrl+c)出来,然后本软件即可选择。
B.建议去网上找一个ArialUni.ttf 字库下载地址:/f/4942778.html2. 选择编码格式,转换模式,字体大小,DPI.3. 选择需要支持的字符集。
4. 设置输出文件类型,及输出路径。
5. 点击build 按钮,转换生成字库。
补充说明:A.若您选择的是MBCS 编码格式,则会根据您选择的字符集数产生相应份数的上述文件。
B.若您选择的是UNICODE 编码格式,不论您选多少个字符集,都只会输出一份上述文件。
C.若生成字库失败,则有可能您选择的字体文件(*.TTF)原本就不包含该字符集的字符信息。
比如:宋体中不存在韩文字符,即用宋体生成的字库无法支持韩文显示。
UCDOS中的点阵字库HZK
UCDOS中的点阵字库HZK12UCDOS中的点阵字库HZK12,HZK16,HZK24,ASC12,ASC16[转]2009年03月10日星期二 13:40如何在嵌入式系统中使用大量的汉字和字符呢DOS前辈们经过艰辛的努力,将制作好的字模放到了一个个标准的库中以免去后辈的麻烦,这就是点阵字库文件。
一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。
不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。
虽然汉字库种类繁多,但都是按照区位的顺序排列的。
前一个字节为该汉字的区号,后一个字节为该字的位号。
每一个区记录94个汉字,位号则为该字在该区中的位置。
因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。
减1是因为数组是以0为开始而区号位号是以1为开始的。
这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。
以16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1))*32。
汉字库文该从该位置起的32字节信息即记录了该字的字模信息。
☆打印字库文件和HZK12如果你有UCDOS的HZK24S(宋体)、HZK24K(楷体)或HZK24H (黑体),你还可以使用不同字体的大字模汉字了。
HZK24系列是24*24的点阵字库,每字模占用3*24字节。
如果你按照HZK16的显示方法的话,你会看到......呵呵,字被放倒了。
这是因为该类字库与一般的汉字库不同,这类大字模汉字库是专供打印的打印字库,为了打印的方便将字模都放倒了,你使用时,只要将字模的位信息纵横转置显示即可。
例如你如果定义为mat[24][3]则应该这样输出:for(i=0;i<24;i++)for(j=0;j<24;j++)if((0x80>>i%8)&mat[j][i/8]) /*转置显示*/putpixel(j+x,y+i,color);还有一类字库HZK12,虽然属于标准字库类型,但如果你将它的字模当作12*12位计算的话,根本无法正常显示汉字。
汉字点阵字库原理
*/ unsigned int DUO_YU_BIT[3]={0,2,4}; #define ZOOMX 1 /*X 方向的放大倍数,1 为原始尺寸*/ #define ZOOMY 1 /*Y 方向的放大倍数,1 为原始尺寸*/
main() {
int x=10,i; int y=10; char *s; char *filename[3]={"e:\\hzk\\hzk16","e:\\hzk\\hzk14","e:\\hzk\\hzk12"}; char *fileasc[3]={"e:\\hzk\\asc16","e:\\hzk\\asc14","e:\\hzk\\asc12"}; char code[32];/*因为不能动态定位,所以取最大值 32*/ char tmpcode[3]={0}; unsigned char mask=0x80; int driver=DETECT,errorcode; int mode; int iOffset; initgraph(&driver,&mode,""); errorcode=graphresult(); if(errorcode!=0) {
unsigned int uiDianZhenSize); void dishz(int x0,int y0,char code[],int color,
unsigned int uiDianZhenSize, unsigned int uiDuoYuBit); /*字模的大小 16*16 点阵 ZI_MO_SIZE=32 14*14 点阵 ZI_MO_SIZE=28 12*12 点阵 ZI_MO_SIZE=24 //该变量一定为 long,否则出错 */ unsigned long ZI_MO_SIZE[3]={32,28,24}; /*汉字点阵 16*16 点阵 ZI_MO_SIZE=16 14*14 点阵 ZI_MO_SIZE=14 12*12 点阵 ZI_MO_SIZE=12 */ unsigned int DIAN_ZHEN_SIZE[3]={16,14,12}; /*多余位数(对于 12*12 和 14*14 点阵字库,该位有意义) 16*16 点阵 ZI_MO_SIZE=0 14*14 点阵 ZI_MO_SIZE=2 12*12 点阵 ZI_MO_SIZE=4
点阵字库和矢量字库
点阵字库的生产原理(转)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置换算法维护此缓存,以减少磁盘读取.。
12864点阵LCD液晶屏带中文字库详细介绍
12864点阵LCD液晶屏带中文字库详细介绍一、概述二、带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和1 28个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
三、基本特性:(1)、低电源电压(VDD:+3.0--+5.5V)(2)、显示分辨率:128×64点(3)、内置汉字字库,提供8 192个16×16点阵汉字(简繁体可选) (4)、内置 128个16×8点阵字符(5)、2MHZ时钟频率(6)、显示方式:STN、半透、正显(7)、驱动方式:1/32DUTY,1/5BIAS (8)、视角方向:6点(9)、背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 (10)、通讯方式:串行、并口可选(1 1)、内置DC-DC转换电路,无需外加负压(12)、无需片选信号,简化软件设计(13)、工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃模块接口说明:*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。
*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。
*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。
2.2并行接口管脚号管脚名称电平管脚功能描述1 VSS 0V 电源地2 VCC 3.0+5V 电源正3 V0 - 对比度(亮度)调整RS=“H”,表示DB7——DB0为显示数据4RS(CS)H/LRS=“L”,表示DB7——DB0为显示指令数据R/W=“H”,E=“H”,数据被读到DB7——DB05R/W(SID) H/LR/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR6 E(SCLK) H/L 使能信号7 DB0 H/L 三态数据线8 DB1 H/L 三态数据线9 DB2 H/L 三态数据线10 DB3 H/L 三态数据线11 DB4 H/L 三态数据线12 DB5 H/L 三态数据线13 DB6 H/L 三态数据线14 DB7 H/L 三态数据线15 PSB H/L H:8位或4位并口方式,L:串口方式(见注释1)16 NC - 空脚17 /RESET H/L 复位端,低电平有效(见注释2)18 VOUT - LCD驱动电压输出端19 A VDD 背光源正端(+5V)(见注释3)20 K VSS 背光源负端(见注释3)*注释1:如在实际应用中仅使用并口通讯模式,可将PSB接固定高电平,也可以将模块上的J8和“VCC”用焊锡短接。
点阵字库和矢量字库
点阵字库的生产原理(转)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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
纵向取模/*-- 文字: 电 --*//*-- 宋体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,。