首先需要理解的是点阵字库是一个数据文件,在这个数据文件里面保存了所有文字的点阵数据.至于什么是点阵,我想我不讲大家都知道 的,使用过"文曲星"之类的电子辞典吧,那个的液晶显示器上面显示的汉子就能够明显的看出"点阵"的痕迹.在 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

{

cols = 0;

for (k=0; 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 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); /* 绘制字模 */

}

以上介绍完了中文点阵字库的原理,当然还有英文点阵字库了.英文点阵字库中单个点阵字模数据的存放方式与中文是一模一样的,也就是对我们所写的 _draw_model 函数同样可以使用到英文字库中.唯一不同的是对点阵字库的寻址上.英文使用的就是 ASCII 码,其码值是0到127,寻址公式为:

英文点阵数据在英文点阵字库中的偏移 = 英文的ASCII码 * 一个英文字模占用的字节数可以看到,区分中英文的关键就是,一个字符是 ASCII 码还是扩展 ASCII 码,如果是 ASCII 码,其范围是0到127,这样是使用的英文字库,如果是扩展 ASCII 码,则与其后的另一个扩展 ASCII 码组成汉字内码,使用中文字库进行显示.只要正确区分 ASCII 码的类型并进行分别的处理,也就能实现中英文字符串的混合输出了。

32*32 点阵字库 linux,点阵字库-linux_wuliqiang-ChinaUnix博客相关推荐

  1. linux挑战:历史命令_博客挑战:分享您关于社区运作方式的知识

    linux挑战:历史命令 通过博客每周社区管理主题来帮助我们收集社区知识. 本周的主题是鼓励新的贡献者. 社区是使开源软件正常工作的原因. 没有两个开源软件是相同的,因此没有两个社区是相同的,但是它们 ...

  2. 帝国cms linux伪静态规则,置帝国cms如何设置tag标签伪静态化 linux伪静态设置方法_博客...

    <置帝国cms如何设置tag标签伪静态化 linux伪静态设置方法_博客>由会员分享,可在线阅读,更多相关<置帝国cms如何设置tag标签伪静态化 linux伪静态设置方法_博客(6 ...

  3. linux 定时任务 (python 爬虫统计博客数据)

    linux 定时任务 (python 爬虫统计博客数据) 1. 任务目标 定时任务中,每天统计一下今日博客的各项数据,并以邮件的形式发送给自己. 2. linux 定时任务 (python) 一切复杂 ...

  4. 【Socket网络编程】0.socket TCP/UDP 可参考 【lx青萍之末】 的 【Linux网络编程 】系列博客

    关于socket TCP/UDP 相关知识 可参考博主[ lx青萍之末] 的 [Linux网络编程 ]系列博客 https://blog.csdn.net/daaikuaichuan/category ...

  5. 制作ghost的linux系统安装方法,技术|如何在Linux平台上安装Ghost博客平台

    Ghost是一个相对较新的博客发布平台,它开始于众筹平台kickstarter上一个£25,000英镑的众筹项目.尽管WordPress依然是网上主流的博客工具,但它现在已然是一个拥有众多第三方开发功 ...

  6. Linux 中安装简洁的博客 Typecho

    CentOS 7 typecho 1.2 我使用的虚拟机进行的安装,也希望练习学习的时候使用虚拟机进行练习. typecho 下载地址:http://typecho.org/download 安装宝塔 ...

  7. linux 上 hexo搭建个人博客

    一.node js 二.安装git 三.新建一个文件夹存放blog 进入创建的文件夹执行hexo init 五.启动自己的博客 然后呢启动自己本地的博客(也可以选择先npm install hexo- ...

  8. linux初学文档,51CTO博客-专业IT技术博客创作平台-技术成就梦想

    linux 里 一切皆文件 7种文件类型: 普通文件 f d 目录 b 块设备 /dev/sda /dev/sda1 /dev/sr0 c 字符设备 /dev/pts/0 /dev/ tty0 #tt ...

  9. 小米系统shell_获取linux系统信息shell | 小米的博客

    本文是对于系统管理员来说非常有帮助的一个获取linux系统详细信息的shell脚本. #!/bin/bash if [[ -f /usr/bin/lsb_release ]]; then OS=$(/ ...

  10. Linux做软raid10,51CTO博客-专业IT技术博客创作平台-技术成就梦想

    [root@RHEL7 ~]# date Fri Aug 19 21:55:01 CST 2016 准备3个盘 [root@RHEL7 ~]# fdisk /dev/sdb [root@RHEL7 ~ ...

最新文章

  1. 设置让php能够以root权限来执行exec() 或者 shell_exec()
  2. Intel Realsense D435 如何设置曝光参数(exposure)
  3. 解决Hibernate报错The server time zone value is unrecognized or represents more than one time zone
  4. 发红包android
  5. 帆软报表(finereport)控件背景色更改
  6. GP学习(二)—Executing tools and Accesubg licensing0
  7. SQLAlchemy Connection
  8. dw代码能在php运行吗,php新手求助,为什么在DW中设计里能看到运行php程序的结果,但…...
  9. 义乌成直播电商掘金地
  10. python 模糊匹配_Case2:模糊匹配工具
  11. TP框架打印输出原生sql语句
  12. 同时新增一个订单与多个明细的方法
  13. java resource注解,Spring依赖注入—@Resource注解使用
  14. ucenter 用户加密方式
  15. 文献解读:纵向数据的测量不变性和交叉滞后模型(一)
  16. 推荐一款快速生成海报的微信小插件
  17. 文件重命名不了怎么办,教你解决办法
  18. centos7 SFTP
  19. 帝国CMS7.5全新后台 仿搜外问答模板 整站带演示数据源码
  20. 加密货币世界里的「数字乞丐」

热门文章

  1. visio 2013安装失败正在回滚
  2. TeamViewer 13界面功能介绍
  3. MySql常用函数大全
  4. pyqt5 点击开始执行_PyQt5教程——第一个程序(2)
  5. 0302 GDB调试走起【给PHP写插件】
  6. [Windows小工具]两款屏幕取色拾色器(免安装,1MB左右大小)
  7. Excel如何导出自定义架构xml
  8. 如何完全卸载MySQL
  9. App Store 审核指南
  10. XLSTransformer+模板 导出 Excel