汉字的显示与放大教学课件PPT.ppt_第1页
汉字的显示与放大教学课件PPT.ppt_第2页
汉字的显示与放大教学课件PPT.ppt_第3页
汉字的显示与放大教学课件PPT.ppt_第4页
汉字的显示与放大教学课件PPT.ppt_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

*1 第十四章第十四章 汉字的显示与放大汉字的显示与放大 汉字的编码 用作图方式显示和放大汉字 直接写vram显示汉字 *2 第一节、汉字的编码 汉字的主要编码 区位码 国标码 机内码 字形码 地址码 *3 汉字数目众多(康熙字典收录47000多个) ,但最常用的高频字仅约100个,常用字约 3000个,次常用字约4000个,罕见字约8000 个,其余都是死字。 1981年,我国公布了通讯用汉字字符集( 基本集)及其交换码标准gb2312-80方案 ,把高频字、常用字、次常用字汇集起来组 成了汉字基本字符集(共6763个汉字)。 概 述 *4 上述基本字符集由三部分组成: 一级汉字 (使用频度较高的3755个汉字,按拼音排序) 二级汉字 (使用频度略低的3008个汉字,按部首排序) 西文字符、数字、图形符号 (700多个非汉字字符) 为管理方便,将上述所有字符排列在了一个 94*94的表格中 一、汉字的区位码 *5 一、汉字的区位码 01 02 03 16 17 18 56 57 01 02 03 04 0506 07 08 09 10 11 1213 14 15 94 94 *6 表中每一行为一个区,每一列为一个位。 汉字(字符)在表中的区号和位号构成了汉 字的区位码。 例如: “啊”在16区01位,故“啊”的区位码是1601 “大”在20区83位,故“大”的区位码是2083 说明:区位码常以十六进制表示, 如:1453h 一、汉字的区位码 *7 二、汉字的国标码 计算机要处理汉字,必须给每个汉字一个 唯一的编码,这些编码是国家机构按统一 标准编排的,故称国标码。 英文字符是用一个字节编码的,即ascii 码,而汉字数量众多,需要用两个字节才 足以完成编码,所以汉字(含前15区的符 号)的国标码是两个字节。 *8 二、汉字的国标码 国标码的两个字节是这样来的:将汉字(含 前15区的符号)的区号和位号分别加上32 并 各用一个字节表示出来。 例如: “啊”的区号是16,位号是1,其国标码是: 00110000 00100001 “大”的区号是20,位号是83,其国标码是: 00110100 01110011 *9 二、汉字的国标码 提示: 汉字区号、位号最大是94 94 + 32 = 126,不超过127 如:设94区94位有汉字,其国标码应为: 01111110 01111110 结论:国标码的两个字节的最高位都是0 *10 三、汉字的机内码 每个汉字都有唯一一个国标码,按说可以用计算机 处理汉字了,但不幸的是,计算机不仅要处理汉字 ,还要处理英文字符,而汉字国标码和英文编码是 存在冲突的。 例如:“大”的国标码是:00110100 01110011,如 果把国标码的这两个字节直接存储到计算机中,则 系统很可能把它们当做两个英文字符(字符4和 字符i),因此计算机内部不能存储国标码。 *11 三、汉字的机内码 为避免和英文的ascii码混淆, 存储汉字前 ,总是先把国标码两个字节的最高位都改为1 然后再存储,这样就由国标码变成了机内码 (计算机内部实际存储的汉字编码)。 如: “大”的国标码是: 00110100 01110011 机内码是: 10110100 11110011 *12 三、汉字的机内码 注意:存储机内码时,总是把区号对应的字 节存储在低字节,而把位号对应的字节存储 在高字节。如: “大”的机内码是: 10110100 11110011 对应区号 对应位号 10110100 11110011 低字节 高字节 *13 三、汉字的机内码 机内码和区位码的转换关系: 区号 = 机内码的低位字节 160 位号 = 机内码的高位字节 160 解释说明: 机内码是在国标码的基础上将两字节最高位都变 为1而得来,相当于两个字节各加了128 而国标码是由区位码各加32而来 *14 四、汉字的字形码 汉字的形状各不相同。为在计算机中 显示汉字,通常都是先把每个汉字的 形状记录下来,形成字形码 例如: 16点阵宋体字库中“大”字的字形码 是这样来的: *15 四、汉字的字形码 画一个16*16的表格,在上面写一个宋体“ 大”。接下来,从左上角的小方格开始记录 “大”字的形状,若小方格被“大”字覆盖, 则记为1,否则记为0。 00000011 00000000 00000011 00000000 00000011 00000000 00000011 00000100 11111111 11111110 00000011 00000000 11000000 00000100 16点阵宋体“大”字 的字形码(32字 节) *16 四、汉字的字形码 将所有汉字(符号)的16点阵宋体字形码 按顺序汇集到一起就是16点阵宋体字库 字库中存有区位表中所有汉字(符号)的 字形码。当需要显示某汉字(符号)时, 先从字库中调出该汉字的字形码,再在屏 幕上显示出来。 *17 四、汉字的字形码 字库有很多种,根据点阵大小不同和汉字 字体的不同,可把字库分为: 16点阵宋体字库、16点阵黑体字库、16点阵仿 宋字库、16点阵楷体字库 24点阵宋体字库、24点阵黑体字库、24点阵楷 体字库 48点阵 60点阵 点阵数越大,笔画越 平滑,点阵数越小, 锯齿越严重。 *18 五、汉字的地址码 对于16点阵的字库, 一个汉字的字形码在字库中存储 的起始位置是: offset=(94*(qh-1)+wh-1)*32 其他点阵(设为s点阵): offset=(94*(qh-1)+wh-1)*s*s/8 汉字字形码在字库中的首地址称作该汉字的地址码 *19 第二节 作图法显示与放大汉字 在西文状态下显示汉字一般处理方法: 在中文操作系统中打开源程序将需要显示的汉字 存入数组(存储的是汉字的机内码) 如:char p =“汉字显示技术”; 程序中 通过机内码计算汉字的区号和位号,从而获得地址码 打开字库文件,读取字形码 图形方式下画点,“点”出汉字 在西文dos下编译、连接、执行 *20 一、把汉字存入内存 在源程序中把要显示的汉字(一个或多个) 存到内存中。 char p = “汉字显示技术”; 或: char *p = “汉字显示技术”; 存储源程序时,实际存储的是这些汉字的机 内码 (正如英文字符要被转换为ascii码) 运行程序时,机内码将被装入内存 *21 二、计算地址码 由机内码可计算出地址码: 从内存中取出一个汉字的机内码,用来计 算区号qh和位号wh。 qh = *(p+i) -160; wh = *(p + i + 1) - 160; 计算该汉字的地址码 (设字库是s点阵) offset = (qh - 1)*94 + (wh - 1)*s*s/8; *22 三、从字库中获得字形码 #define s 16 /点阵数 #define hzk “d:tcfonthzk16f” char buffers*s/8; /用来存字形码 if(fp = fopen(hzk, “rb“) = null) printf(“打不开字库文件n”); exit(0); fseek(fp, offset, 0); fread(buffer, s*s/8, 1, fp); *23 四、画出汉字 设要在屏幕的(x,y)处显示该汉字 坐标 x,y 第0字节对应 的8个像素 第25字节对 应的8个像素 *24 要在屏幕上显示出汉字,需要对字型码中的每个字 节进行处理,将每个字节变成8个像素 编程思路: for(i = 0; i s*s/8 ; i+) /将第i个字节的字型码,画成8个点 四、画出汉字 (方法一) *25 四、画出汉字 (方法一) 字形码的第i个字节,所决定的8个像素的起点 是(x+(i%(s/8)*8, y+i*8/s)。 程序中要针对第i个字节的8个位依次进行判断 和操作, 对于字形码为1的位,画出一个点 char mask = 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 ; for(j = 0; j = 7; j+) if(bufferi *26 故,循环处理字形码每个字节的代码是: char mask = 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 ; for(i = 0; i s*s/8 ; i+) for(j = 0; j = 7; j+) if(bufferi x += s+5; /设置字间隔 四、画出汉字 (方法一) 详细代码:s14_1_1. c *27 四、画出汉字 (方法二) 也可以针对点阵图中的每一像素来循环 可以算出, 图中第i行第j列的像素由字形码的第 (s/8*i+j/8)字节决定,因此循环可写成: for(i = 0; i = s-1; i+) for(j = 0; j = s-1; j+) if(buffers/8*i + j/8) 详细代码:s14_1_2. c *28 五、汉字的放大 汉字的放大实际上就是把一个像素变成几个 像素。例如,若将汉字放大2倍,则汉字的宽 度和高度都要变成2倍,原来的一个像素要变 成4个像素。 若要放大m倍,则要把1个像素变成m2个像素 for(k = 0; k m; k+) for(n = 0; n m; n+) putpixel(x+m*j+k, y+i*m+n, color); 详细代码:s14_2. c *29 实 训 1、编写程序,在图形状态下显示自己的姓名 ,然后再放大二倍显示。 2、请针对打印字库修改例14.1、14.2 说明:字库分为显示字库和打印字库两种,区别有两点: 显示字库中每个字的字形码是按行存放的(先存第一 行,再存第二行),而打印字库中的字形码是按列 存放的(先存第一列,再存第二列) 打印字库去掉了115区的符号,从1区开始就是汉字 *30 第三节 直接写vram显示汉字 直接写屏,实际上就是图形方式下,把要显 示汉字的点阵信息直接存入vram相应的位 面上,写的过程就是显示的过程。 直接写vram显示汉字比作图法显示汉字快 很多。 两种方法: 利用定序器直接写vram 用方式寄存器和位屏蔽寄存器直接写vram *31 一、利用定序器直接写vram vga显示适配器中的定序器中,有5个寄存 器共用一个口地址0x3c5,使用的是哪一个寄 存器,是由索引寄存器(口地址0x3c4)中的 索引值决定的。 索引寄存器的值 (口地址0x3c4) 对应的寄存器 (口地址都是0x3c5) 0复位 1时钟模式 2颜色位面写允许 3字符发生器选择 4存储器模式 *32 一、利用定序器直接写vram 数据 2 0:xx寄存器 4:xx寄存器 1:xx寄存器 2:颜色位面 写允许寄存器 3:xx寄存器 索引寄存器 口地址:0x3c4 口地址: 0x3c5 数据送入口地址为3c5的寄存器过程: *33 一、利用定序器直接写vram 要选择颜色位面写允许寄存器,应向索引寄 存器送入2:outportb(0x3c4, 2); 颜色位面写允许寄存器的值(低4位)决定着 vram的4个位面是否可写。如: 颜色位面写允许寄存器 xxxx1011 位面3 可写 位面2 不可写 位面1 可写 位面0 可写 *34 一、利用定序器直接写vram 直接写vram显示汉字,就是通过“颜色位 面写允许寄存器”的控制把字形码写到指定位 面上。 方法:把汉字的颜色写入“颜色位面写允 许寄存器” outportb(0x3c5, color); 作用:有选择地把字形码写入一些位面, 写入哪些位面由color决定。 *35 一、利用定序器直接写vram 如:设字形码第一个字节为10xxxxxx (下同) 若color为white(15, 二进制: 1111), 则: 字形码将写入4个位面,字形码为1的像素将显示为 白色,为0的像素显示为黑色 写允许寄存器低四位 1111 位面3 可写 位面2 可写 位面1 可写 位面0 可写 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 位面3 位面2 位面1 位面0 每位面64kb *36 一、利用定序器直接写vram 若color值为blue(1, 二进制: 0001), 则: 只写位面0,其余三个位面保持原数据不变(若原 数据都是0,对于第一点,像素将是蓝色,第二点 为黑色) 原来数据不是0(背景不是黑色)呢? 写允许寄存器低四位 0001 位面3 不可写 位面2 不可写 位面1 不可写 位面0 可写 10xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 位面3 位面2 位面1 位面0 每位面64kb *37 一、利用定序器直接写vram void disphz(int x, int y, char*buffer, int color) /x 、y是汉字显示坐标,buffer是字形码首址 char far *p; int i, j; p = (char far*)(0xa0000000 + 80*y + x/8); outportb(0x3c4, 2); outportb(0x3c5, color); for(i = 0; i s; i+) /一个汉字要显示s行像素 for(j = 0; j s/8; j+) /每行要写s/8个字节 *(p + 80*i + j) = buffers/8*i + j; outportb(0x3c5,0xf); 每行640像素,80字节 因此,要求显示汉字 的横坐标必是8的倍数 课堂演示:14_1 c *38 一、利用定序器直接写vram 上面程序仅在背景色为黑(四个位面的原数 据都是0 ) 的情况下能按指定颜色显示一个 汉字。 若背景色不是黑色(原数据不是0 ) ,显示 的汉字通常不是指定颜色。若要在任意背景 下都显示指定颜色,需要对4个位面的数据都 改写。 *39 一、利用定序器直接写vram 例如: 设字形码第一个字节为10xxxxxx (下同) 要将汉字显示成淡绿色(color:10,二 进制值:1010),则: 字形码为1时,四个位面的数据必须是1010,以便 显示一个淡绿色的点 位面3、1要写成1 位面2、0要写成0 0xxxxxx 1xxxxxx 0xxxxxx 1xxxxxx 位面3 位面2 位面1 位面0 每位面64kb *40 一、利用定序器直接写vram 例如: 要将汉字显示成淡绿色(color:10,二 进制值:1010),则: 字形码为0时,所有位面上该位的值均应保持原值 位面3、1不变 位面2、0不变 0xxxxxx 1xxxxxx 0xxxxxx 1xxxxxx 位面3 位面2 位面1 位面0 每位面64kb *41 一、利用定序器直接写vram 也就是: 对于位面3和位面1, 字形码为1的位,要写入1 字形码为0的位,保持原值 对于位面2和位面0 字形码为1的位,要写入0 字形码为0的位,保持原值。 因为向vram写字形

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论