第3部分高级编程技术的实现.ppt

上传人:本田雅阁 文档编号:2528629 上传时间:2019-04-05 格式:PPT 页数:150 大小:1.31MB
返回 下载 相关 举报
第3部分高级编程技术的实现.ppt_第1页
第1页 / 共150页
第3部分高级编程技术的实现.ppt_第2页
第2页 / 共150页
第3部分高级编程技术的实现.ppt_第3页
第3页 / 共150页
亲,该文档总共150页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第3部分高级编程技术的实现.ppt》由会员分享,可在线阅读,更多相关《第3部分高级编程技术的实现.ppt(150页珍藏版)》请在三一文库上搜索。

1、第3章 高级编程技术的实现,操作手段 显示方式 图形绘制技术 图像技术 动画技术 发声技术 汉字显示技术 精确的时间控制技术,第3章 高级编程技术的实现,操作手段:键盘,在键盘内有一个微处理器,用来扫描和检测每个键的按下和抬起状态,然后以程序中断(INT 9H)的方式与主机通信,向主机传送一个字节的按键扫描码。接着ROM中BIOS内的键盘中断处理程序,将按键扫描码翻译成对应的ASCII码或扩充的ASCII码,存放在AX寄存器中。,原理,第3章 高级编程技术的实现,操作手段:键盘,方法,方法一:直接使用声明在bios.h中的库函数bioskey(); 方法二:通过库函数int86(),调用BIO

2、S的INT 16H、功能 号为0的中断。它将按键的扫描码存放在AH寄存器 中; 方法三:简单地利用声明在conio.h中的库函数kbhit()。,第3章 高级编程技术的实现,操作手段:键盘,方法一,int bioskey(int cmd);/*参数cmd用来确定函数如何操作*/,cmd=0 bioskey()返回按健的键值,该值是2个字节的整型数。若没有键按下,则该函数一直等待,直到有键按下。当按下时,若返回值的低8位为非零,则表示为普通键,其值代表该键的ASCII码。若返回值的低8位为0,则高8位表示为扩展的ASCII码,表示按下的是特殊功能键,第3章 高级编程技术的实现,操作手段:键盘,方

3、法一,int bioskey(int cmd);/*参数cmd用来确定函数如何操作*/,cmd=1 bioskey()查询是否有键按下。若返回非0值,则表示有键按下,若为0表示没键按下。,第3章 高级编程技术的实现,操作手段:键盘,方法一,int bioskey(int cmd);/*参数cmd用来确定函数如何操作*/,cmd=2 bioskey()将返回一些控制键是否被按过,按过的状态由该函数返回的低8位的各位值来表示: 字节位 对应的16进制数 含义 0 0x01 右边的shift键被按下 1 0x02 左边的shift键被按下 2 0x04 Ctrl键被按下 3 0x08 Alt键被按下

4、 4 0x10 Scroll Lock已打开 5 0x20 Num Lock已打开 6 0x40 Caps Lock已打开 7 0x80 Insert已打开,第3章 高级编程技术的实现,操作手段:键盘,方法二,/* 读键函数,返回扫描码 */ int getKeySCode() union REGS rg; rg.h.ah=0; int86(0x16, ,第3章 高级编程技术的实现,操作手段:键盘,方法三,int kbhit(void); 若按了键盘,该函数返回值1,否则返回值0。,第3章 高级编程技术的实现,操作手段:鼠标,DOS操作系统和Turbo C 2.0并不支持鼠标器的操作。要操纵鼠

5、标器,首先必须安装相应的鼠标驱动程序。鼠标驱动程序由生产鼠标的厂家提供,它提供了许多鼠标操作的功能。这些功能可以通过INT 33H鼠标中断调用来使用。,原理,第3章 高级编程技术的实现,操作手段:鼠标常用功能,/* 显示鼠标器光标 */ void cursorOn() union REGS r; struct SREGS s; r.x.ax1; /* 1号鼠标器功能:显示鼠标光标 */ msvisibleTRUE; int86x(0x33,&r,&r,&s); ,第3章 高级编程技术的实现,/* 关闭鼠标器光标 */ void cursorOff() union REGS r; struct

6、SREGS s; r.x.ax2; /* 2号鼠标器功能 :不显示鼠标光标 */ msvisibleFALSE; int86x(0x33,&r,&r,&s); ,操作手段:鼠标常用功能,第3章 高级编程技术的实现,/*设定鼠标光标的初始位置*/ void cursorXY(unsigned int x, unsigned int y) union REGS r; struct SREG s; r.x.ax=4; /* 4号鼠标器功能:设置鼠标光标位置 */ r.x.cx=x; /* 设定光标x坐标 */ r.x.dx=y; /* 设定光标y坐标 */ int86x(0x33, ,操作手段:鼠标

7、常用功能,第3章 高级编程技术的实现,/*报告鼠标器当前光标位置和当前按键状态*/ void mouseRead() union REGS rl,r2; struct SREGS s; r1.x.ax=3; /* 3号鼠标器功能:取按钮状态和鼠标位置 */ int86x(0x33, /* 鼠标器按健状态 */ ,操作手段:鼠标常用功能,第3章 高级编程技术的实现,/*等待鼠标器的某种状态*/ void wait(int i) do mouseread(); while(mousekey=i); ,操作手段:鼠标常用功能,第3章 高级编程技术的实现,操作手段 显示方式 图形绘制技术 图像技术 动

8、画技术 发声技术 汉字显示技术 精确的时间控制技术,第3章 高级编程技术的实现,显示方式:显示系统,显 卡,第3章 高级编程技术的实现,显示方式:显示系统,常见显卡及其模式,第3章 高级编程技术的实现,显示方式:显示系统,显示器工作方式,显示器有两种工作方式,即文本显示方式和图形显示方式,它们的主要差别是显示存储器(VRAM)中存的信息不同。文本方式时,VRAM存放要显示字符的ASCII码,用它作为地址,取出字符发生器ROM中存放的相应字符的图像变成视频信号在显示器屏幕上进行显示。图形方式时,则要显示的图形的图像直接存在VRAM中,VRAM中某地址单元存放的数就表示了相应屏幕上某行和列上的像素

9、及颜色。,第3章 高级编程技术的实现,显示方式:,也称作字符显示方式,是Turbo C确省的显示方式。文本方式屏幕的最大分辨单位是单个字符,字符显示的位置用行和列坐标来表示。,文本方式,第3章 高级编程技术的实现,显示方式:文本方式方式设定,Turbo C支持的几种文本显示方式可以用下面的函数来设置: void textmode(int newmode);。,第3章 高级编程技术的实现,显示方式:文本方式颜色设置,第3章 高级编程技术的实现,显示方式:文本方式窗口设置,Turbo C确省定义的文本窗口为整个屏幕。用户可以通过函数: void window(int left, int top,

10、int right, int bottom); 定义屏幕上的一个矩形域作为窗口。参数(left,top)是窗口左上角所在的屏幕坐标,(right,bottom)是窗口的右下角所在的屏幕坐标。窗口定义之后,用有关窗口的输入输出函数就可以只在此窗口内进行操作而不超出窗口的边界。另外,一个屏幕可以定义多个窗口,但现行窗口只能有一个。,第3章 高级编程技术的实现,显示方式:文本方式窗口操作,窗口内文本输出函数: int cprintf(char *format,表达式表); int cputs(char *str); int putch(int ch); /*这三个函数受窗口的控制,窗口内显示光标的位

11、置就是它们开始输出的位置。当输出行超过窗口右边界或输出到窗口底部边界时,会自动转到窗口内的下一行输出或自动上卷窗口内的内容继续输出*/ 光标操作函数: void gotoxy(int x, int y); /*把光标移到窗口(x,y)处*/,第3章 高级编程技术的实现,显示方式:文本方式屏幕操作,清屏函数: void clrscr(void); /*清除窗口文本,光标移到(1,1)*/ void clreol(void); /*清除窗口从光标位置开始到本行 结尾的所有字符,但光标不变 */ void delline(void); /*删除当前窗口的当前行*/,第3章 高级编程技术的实现,显示方

12、式:文本方式屏幕操作,屏幕文本移动函数: void movetext(int x1, int y1, int x2, int y2, int x3, int y3); 屏幕文本存取函数 void gettext(int x1, int y1, int x2, int y2, void *buffer); void puttext(int x1, int y1, int x2, int y2, void *buffer);,第3章 高级编程技术的实现,显示方式:文本方式,编制一个程序,将屏幕垂直平分成两个窗口,左边窗口为蓝色背景,白色前景,右边窗口为绿色背景,红色前景。两个窗口都设计为文本输入,

13、即在窗口中可以输入文字,在窗口屏幕中显示出来。使用tab键在左右两个窗口中切换,每个窗口都有光标,活动窗口光标进行闪烁。,应用实例,问题描述,第3章 高级编程技术的实现,显示方式:文本方式,首先用文本窗口函数window (int x1, int y1, int x2, int y2)画出两个窗口,用textcolor (int color),textbackground (int color),clrscr (void)等进行窗口属性的设置。用tab键进行两个窗口间的循环切换,在每次切换前先调用gettext (int left, int top, int right, int bottom

14、, void * buf)函数把当前矩形窗口上的字符拷贝到由buf所指向的内存中,在切换到另一个窗口后调用puttext (int left, int top, int right, int bottom, void * buf)把先前存储在该窗口buf所指向的内存中的字符拷贝到当前窗口中,并用gotoxy (int x, int y)把光标移到原先所在位置,因此可以接着先前的文本继续编辑。,应用实例,设计思想,第3章 高级编程技术的实现,显示方式:文本方式,应用实例,程序运行截图,第3章 高级编程技术的实现,显示方式:,图形方式,图形显示方式可以满足在屏幕上作图的要求。在此方式下,屏幕显示的

15、单位是像素。屏幕显示的像素大小(分辨率)可以通过设置不同的显示方式来改变。像素在屏幕上的位置可由其所在的x,y坐标来决定。此时,屏幕的坐标系统就象一个倒置的直角坐标系。,第3章 高级编程技术的实现,显示方式:图形方式方式设定,图形系统的初始化: 用什么类型的显卡的驱动程序 采用什么模式的图形方式 适配器驱动程序的寻找路径名。 注意:所用系统的卡一定要支持所选用的显示模式,否则将出错。,第3章 高级编程技术的实现,显示方式:图形方式方式设定,图形系统的初始化函数: void far initgraph(int far *pdriver,int far *pmode,char far *ppath

16、_for_driver);,第3章 高级编程技术的实现,显示方式:图形方式方式设定,图形系统的初始化函数: void far initgraph(int far *pdriver,int far *pmode,char far *ppath_for_driver);,第3章 高级编程技术的实现,显示方式:图形方式方式设定,图形系统检测函数 : void far detectgraph(int far *pdriver,int far *pmode); 完成对适配器的检查并得到显示器类型号和相应的最高分辨率模式,将graphdriver设成DETECT, initgraph()将调用detect

17、graph()自动检测所用显卡类型,并将相应的驱动程序装入,并将其最高的显示模式作为当前显示模式。 int graphdriver=DETECT,graphmode; initgraph(,第3章 高级编程技术的实现,显示方式:图形方式方式设定,清屏函数: 画图前一般需清除屏幕,使得屏幕如同一张白纸,以画最新最美的图画。 void far cleardevice(void); 图形系统的关闭: 当画图结束时可以通过调用关闭图形系统的函数: void far closegraph(void); 使显示器恢复到调用initgraph()函数之前的文本方式。,第3章 高级编程技术的实现,显示方式:图

18、形方式颜色设置,前景色设置函数: void far setcolor(int color); 背景色设置函数: void far setbkcolor(int color);,第3章 高级编程技术的实现,显示方式:图形方式颜色设置,前景色设置函数: void far setcolor(int color); 背景色设置函数: void far setbkcolor(int color);,第3章 高级编程技术的实现,显示方式:图形方式颜色设置,CGA前景色的取值:,第3章 高级编程技术的实现,显示方式:图形方式颜色设置,CGA背景色的取值:,第3章 高级编程技术的实现,显示方式:图形方式颜色设

19、置,EGA/VGA调色板:,64/256色选一,第3章 高级编程技术的实现,显示方式:图形方式颜色设置,EGA/VGA调色板:,单色设置: void far setpalette(int index, int actual_color);,第3章 高级编程技术的实现,显示方式:图形方式颜色设置,EGA/VGA标准色:,第3章 高级编程技术的实现,显示方式:图形方式图视口,设置函数: void far setviewport(int xl,int y1,int x2,int y2, clipflag); 其中(x1,y1)为图视口的左上角所在的原屏幕物理坐标,(x2,y2)为右下角所在的原屏幕物

20、理坐标。clipflag参数clipflag若为0,则超出图视口的图形部分仍将显示出来;否则,超出图视口的部分将被切除而不显示。 清除函数: void far clearviewport(void),第3章 高级编程技术的实现,显示方式:图形方式文本输出,当前位置文本输出函数: void far outtext(char far *textstring); 定位文本输出函数: void far outtextxy(int x,int y,char far *textstring); 文本输出字符串函数 int sprintf(char *string, char *format, argume

21、nt, );,第3章 高级编程技术的实现,显示方式:图形方式文本输出,文本输出位置函数: void far settextjustify(int horiz,int vert);,第3章 高级编程技术的实现,显示方式:图形方式文本输出,定义文本字型函数: void far settextstyle(int font,int direction,int char size);,第3章 高级编程技术的实现,#include main() int i,graphdriver,graphmode,size,page; char s30; graphdriver=DETECT; initgraph(,应

22、用实例,程序源代码,settextstyle(SMALL_FONT,HORIZ_DIR, 2); settextjustify(LEFT_TEXT,0); outtextxy(220,80,“Smallfont“); settextstyle(SANS_SERIF_FONT,HORIZ_DIR,2); settextjustify(LEFT_TEXT,0); outtextxy(220,110,“Sans serif font“); settextstyle(GOTHIC_FONT,HORIZ_DIR, 2); settextjustify(LEFT_TEXT,0); outtextxy(22

23、0,140,“gothic font“); getch(); closegraph(); ,显示方式:图形方式文本输出,第3章 高级编程技术的实现,应用实例,程序输出,显示方式:图形方式文本输出,第3章 高级编程技术的实现,操作手段 显示方式 图形绘制技术 动画技术 发声技术 汉字显示技术 图像技术 精确的时间控制技术,第3章 高级编程技术的实现,图形绘制,void far moveto(int x,int y); 移动画笔到指定的(x,y)位置,移动过程不画。 void far moverel(int dx,int dy); 画笔从现行位置(x,y)处移到一位置增量处(x+dx,y+dx),

24、移动过程不画: int far getx(void); 得到当前画笔的x位置 int far gety(void); 得到当前画笔的y位置,:画笔定位,第3章 高级编程技术的实现,图形绘制,画点函数: void far putpixel(int x,int y,int color); 该函数表示在指定的x,y位置画一点,点的显示颜色由设置的color值决定。 int far getpixel(int x,int y); 该函数与putpixel()相对应,它得到在(x,y)点位置上的像素的颜色值,:点和线,第3章 高级编程技术的实现,图形绘制: 点和线,画线函数: void far line(

25、int x0,int y0,int x1,int y1); 该函数从(x0,y0)点到(x1,y1)点画一直线。 void far lineto(int x,int y); 该函数将从现行画笔位置到(x,y)点画一直线。 void far linerel(int dx,int dy); 该函数将从现行画笔位置(x,y)到位置增量处 (x+dx,y+dy)画一直线。,第3章 高级编程技术的实现,线类型的设置: 在确省的情况下,画线函数画出的线都是一个像素点宽的细实线。也可以在画线之前通过函数: void far setlinestyle(int linestyle,unsigned upatte

26、rn,int thickness); 定义线的类型和粗细。,setlinestyle(4,0xF3D0,1)设置的线型,图形绘制: 点和线,第3章 高级编程技术的实现,BIOS的10H中断负责显示器服务,该中断的主要功能通过对AH来设置: AH=00H,功能为设置显示方式。此时通过对AL进行设置来设定显示方式,如设置AL=13H,则显示方式设置为VGA的256色320200图形显示模式。 AH=0CH,功能为画点。这时AL中设置的值为颜色号,CX和DX的值决定画点的位置坐标。,图形绘制: 点和线,利用BIOS调用,第3章 高级编程技术的实现,#include #include int main

27、() int i,j; union REGS inreg,outreg; inreg.h.ah=0; /*置屏幕显示方式*/ inreg.h.al=0x13; /* 定义VGA256色320200图形模式 */ int86(0x10,/*写点*/,应用实例,在屏幕上画出颜色不同的256条直线的程序源代码,inreg.h.al=i; /*置颜色号*/ inreg.h.ch=0; /*决定画点位置*/ inreg.h.cl=i; inreg.h.dh=0; inreg.h.dl=j; int86(0x10, ,图形绘制: 点和线 利用BIOS调用,第3章 高级编程技术的实现,图形绘制,:矩形、圆和

28、弧线,画矩形的函数: void far rectangle(int xl,int y1,int x2,int y2); 画椭圆、圆和扇形图函数: void ellipse(int x,int y,int stangle,int endangel, int xradius,int yradius); void far circle(int x,int y,int radius); void far arc(int x,int y,int stangle,int endangle, int radius);,第3章 高级编程技术的实现,编写程序,使用鼠标进行如下操作:按住鼠标器的任意键并移动,十字

29、光标将随鼠标而移动,根据按键的不同采用不同的形状来画出相应的移动轨迹:当仅按下左键时用圆圈;仅按下右键时用矩形;其它按键情况用线条。,应用实例,问题描述,图形绘制,第3章 高级编程技术的实现,结合鼠标使用方法和上述的图形绘制函数来解决问题。由于在Windows2000/XP下不支持INT 33的1号显示鼠标光标功能,可以用画线函数line()画出一个十字形光标。光标的移动是通过将原位置光标用背景色再画而使其消失,然后在新位置处重新画一个光标,从而实现光标移动的动感。,应用实例,设计思想,图形绘制,第3章 高级编程技术的实现,应用实例,程序运行截图,图形绘制,第3章 高级编程技术的实现,图形绘制

30、:封闭图形的填色,填充设置函数 : void far setfillstyle(int pattern,int color); 该函数将用设定的color颜色和pattern图模式对后面画出的轮廓图进行填充,这些图轮廓是由待定函数画出的。,第3章 高级编程技术的实现,图形绘制:封闭图形的填色,填充设置函数 : void far setfillstyle(int pattern,int color),第3章 高级编程技术的实现,图形绘制:封闭图形的填色,用户自定义填充函数: void far setfillpattern(char upattefn,int color); 该函数设置用户自定义可

31、填充模式,以color指出的颜色对封闭图形进行填充。参数upattern是一个指向8个字节存储区的指针,这8个字节表示了一个88像素点阵组成的填充图模,它是由用户自定义的,用来对封闭图形填充。8个字节的图模是这样形成的:每个字节代表一行,而每个字节的每一个二进制位代表该行的对应列上的像素。是1,则用color显示,是0则不显示。,第3章 高级编程技术的实现,图形绘制:封闭图形的填色,得到目前的填充模式和颜色的函数 : void far fillsettings(struct fillsettingstype far *fillinfo); void far getfillpattern(cha

32、r *upattern);,第3章 高级编程技术的实现,图形绘制:封闭图形的填色,可填充的基本图形函数: (这些函数绘制的图形,将根据事先用setfillstyle函数设置的填充模式和颜色,或按缺省方式进行填充 ) void bar(int x1,int y1,int x2,int y2); void far pieslice(int x,int y,int stangle,int endangle,int radius); void far bar3d(int x1,int y1,int x2,int y2,int depth,int topflag); void far sector(in

33、t x,int y,int stangle,int endang1e,int xradius,int yradius); void far fillellipse(int x,int y,int xradius,int yradius); void far fillpoly(int numpoints,int far polypoints);,第3章 高级编程技术的实现,图形绘制:封闭图形的填色,可对任意封闭图形填充的函数 : void far floodfill(int x,int y,int border); 该函数将对任一封闭图形进行填充,其颜色和模式将由设定的或缺省的图模与颜色决定。其

34、中参数(x,y)为封闭图形中的任一点,border是封闭图形的边框颜色。编程时该函数位于画封闭图形(即要填充的图形)的代码之后。,第3章 高级编程技术的实现,#include main() int i, graphdriver,graphmode,size,page; char s30; graphdriver=DETECT; initgraph(,应用实例,程序源代码,settextstyle(1,0,6); /*设置字形方向,尺寸 */ outtextxy(100,60,“Welcom You“); setviewport(100,200,540,380,0); setcolor(14);

35、 setfillstyle(1,12); rectangle(20,20,420,120); settextstyle(2,0,9); floodfill(21,100,14); /*用深蓝色填充*/ sprintf(s,“Lets study Turbo C”); setcolor(YELLOW); outtextxy(60,40, s);/*用黄色显示*/ setcolor(1); settextstyle(4,0,3); outtextxy(110,80,s); getch(); closegraph(); ,图形绘制,第3章 高级编程技术的实现,应用实例,程序输出,图形绘制,第3章 高

36、级编程技术的实现,操作手段 显示方式 图形绘制技术 图像技术 动画技术 发声技术 汉字显示技术 精确的时间控制技术,第3章 高级编程技术的实现,图像技术:图像的二种来源,(1)屏幕图像:在图形方式下所绘图形形成的像素点图像 。图像数据直接存储在VRAM中,VRAM中某地址单元存放的数就表示了相应屏幕上某行和列上的像素及其颜色值 。 (2)图像文件:图像数据以一定的格式存储在文件中。需要有专门的软件来支持,或自己编写程序来读取、显示和生成某种格式的图像文件。首先必须要了解某种图像文件的格式。,第3章 高级编程技术的实现,图像技术:屏幕图像与VRAM,直接写屏:在图形方式下将图像数据直接写入VRA

37、M的过程,即图像显示过程。直接写屏是最快的图像显示方法。,第3章 高级编程技术的实现,图像技术:VRAM与系统存储器的对应关系,CGA的VRAM对应的内存地址开始于B8000H,VGA、EGA的开始于A0000H。 对CGA,VRAM仅有16K字节;对VGA和EGA,VRAM可达256K字节,它分成独立的4个64K字节部分,这样的每个部分称为一个位面或页面(编号0-3),它们共同占有一块内存空间,即用同一的64K个地址。相应内存的每个地址实际上代表VRAM4个位面上相并列的4个字节。 对于SVGA,由于它要存取更高分辨率或更多颜色的数据,一般都至少拥有512K以上的VRAM,但其所占用的内存地

38、址仍大都是64K,因此也需要划分许多页面,对应到A0000H或其它的视频内存地址上。,第3章 高级编程技术的实现,图像技术:屏幕图像的允许读写过程,允许读的过程是:首先通过索引寄存器(接口地址为0x3ce)选择读位面选择寄存器(其索引号为4),然后通过读位面选择寄存器(接口地址0x3cf)选择位面号。相应的代码为: outportb(0x3ce, 4); /*将索引号4送索引寄存器,选择读位面选择寄存器* /outportb(0x3cf, n); /*将选择的位面号n送读位面选择寄存器,允许该位面可读*/,第3章 高级编程技术的实现,图像技术:屏幕图像的读写过程,允许写的过程是:首先通过索引寄

39、存器(接口地址为0x3c4)选择位面写允许寄存器(索引号为2),然后通过接口地址0x3c5选择位面号。相应的代码为: outportb(0x3c4, 2); /*将索引号2送索引寄存器,选择位面写允许寄存器*/ outportb(0x3c5, k); /*送位面号至位面写允许寄存器,允许该位面可写*/,第3章 高级编程技术的实现,图像技术:屏幕图像数据在VRAM中存放格式,CGA的4色320200的模式,视频内存起始地址B0000H。屏幕上显示的像素点从左到右,从上到下依次存在VRAM从0号地址开始的连续地址中,每个像素占2位,VRAM每个字节存放四个像素点。 特殊的地方:屏幕上显示的偶行像素

40、存在16KVRAM的上半部,而奇行存在下半部。从系统地址看,上半部开始于B800:0000,下半部开始于B800:1000。,第3章 高级编程技术的实现,图像技术:屏幕图像数据在VRAM中存放格式,VGA视频内存起始地址A0000H,在16色640480模式下采用位面对应方式,视频内存地址上每一个字节代表8个像素,每一位又可对应到位面中同样位置的4位上(4位的组合表示16色之一,因此又称位面为颜色位面)。 在屏幕上绘出一个点时,就必须将数据分别存放到四个位面中对应的位上。,第3章 高级编程技术的实现,图像技术:屏幕图像数据在VRAM中存放格式,在256色320200模式下采用的是线性对应的方法

41、(SVGA的所有256色和真彩都是用这种方法)。 线性对应将屏幕上每一点与视频内存地址按顺序一一对应起来,一个点对应一个字节,这样做的好处是:这种对应方式比位面对应方式简单多了,因为只需直接对视频内存地址做存取即可,而不必理会位面与内存地址的对应关系。,第3章 高级编程技术的实现,图像技术:屏幕图像的操作,屏幕图像的存储和显示操作函数,第3章 高级编程技术的实现,图像技术:图像像素与背景像素的逻辑操作,第3章 高级编程技术的实现,图像技术:屏幕图像操作实例,绘制满屏的16色圆和长方形,并将屏幕图像保存到文件pic.dat中。然后将保存在文件pic.dat的屏幕图像重新显示在VGA屏幕上。,应用

42、实例,问题描述,第3章 高级编程技术的实现,图像技术:屏幕图像操作实例,应用实例,注意事项,VGA的VRAM起始地址为A0000H,开始单元的地址为0xA000:0x0000。 存取对应屏幕图像VRAM中的信息时,其开始地址指针定义为:ptr=(charfar*)0xa0000000L; 由于程序将显示模式设置为VGAHI模式,分辨率是640480,16色,每个像素由每个位面上的1位组成,即一个字节代表8个像素,故对应的内存地址是从A0000H开始的38400个字节地址。 由于系统初始化时,读位面选择寄存器设置为位面0,程序最后应恢复原系统初始化设置。,第3章 高级编程技术的实现,图像技术:屏

43、幕图像操作实例,应用实例,源程序,/*保存屏幕图像*/ void save_pic(char *fname) FILE *fp; int i; long j; char far *ptr; fp=fopen(fname,“wb“); for (i=0;i4; i+) outportb(0x3ce, 4); /*选择读位面选择寄存器*/ outportb(0x3cf, i); /*允许位面i可读*/ ptr=(char far*)0xa0000000L; /*VGA的VRAM指针*/,for (j=0;j38400L;j+) fputc(*ptr, fp); ptr+; fclose(fp);

44、outport(0x3cf,0); ,第3章 高级编程技术的实现,图像技术:屏幕图像操作实例,应用实例,源程序,/*从文件载入图像*/ void load_pic(char *fname) FILE *fp; int i,k=1; long j; char far *ptr; fp=fopen(fname,“rb“); for (i=0;i4; i+) outportb(0x3c4, 2); /*选择位面写允许寄存器*/ outportb(0x3c5, k); /*选择位面号*/ ptr=(char far*)0xa0000000L; /*VGA的VRAM指针*/ for (j=0;j3840

45、0L;j+) /*读满屏信息字节数*/, *ptr=fgetc(fp); /*从文件中将图像信息字节写到 VRAM中*/ ptr+; /*字节地址加1*/ k=k*2; fclose(fp); getch(); outport(0x3c5,0xf); /*恢复位面允许写寄存器的缺省值*/ ,第3章 高级编程技术的实现,图像技术:图像文件,图像文件由文件头和图像数据组成。 文件头的内容一般包括文件类型、文件制作者、制作时间、版本号、文件大小和压缩方式等。 常见的图像格式有BMP、JPEG、GIF、TIFF等。,第3章 高级编程技术的实现,图像技术: BMP图像文件,BMP文件由4个部分组成:文件

46、头、信息头、彩色表和图像数据 文件头包含有关于文件类型、文件大小、存放位置等信息 信息头包含关于这幅图像的信息,如以像素为单位的图像的宽度和高度。 彩色表记录图像颜色的RGB值,第3章 高级编程技术的实现,图像技术: BMP图像文件,图像的每一扫描行由表示图像像素的连续的字节组成,每一行的字节数取决于图像的颜色数目和用像素表示的图像宽度。 通常扫描行是由底向上存储的,就是说,阵列中的第一个字节表示位图左下角的像素,而最后一个字节表示位图右上角的像素。 每一扫描行的字节数必需是4的整倍数,也就是DWORD对齐的。,第3章 高级编程技术的实现,图像技术: BMP图像文件,说明: 并不是所有的BMP

47、文件都有彩色表。 若有彩色表,如8位256色的BMP图像,其图像数据的每一字节代表一个像素,但是它的值是彩色表的一个索引而不是该像素的RGB值; 若没有彩色表,如16位高彩色或24位真彩色文件,像素值直接表示RGB值。,第3章 高级编程技术的实现,图像技术:BMP图像文件的格式,第3章 高级编程技术的实现,图像技术:BMP图像文件的格式,第3章 高级编程技术的实现,图像技术:BMP图像文件的格式,第3章 高级编程技术的实现,图像技术:BMP图像的显示,Turbo C提供的BGI图形接口的局限: 只支持VGA及以前的各种图形显示模式; 调色板颜色为标准的,难以改变; 显示的分辨率及色彩数有限。

48、通过对显卡的VRAM直接进行访问来突破上述局限,第3章 高级编程技术的实现,图像技术:BMP图像的显示,目前常用的图形显示模式集中在256色上,主要包括 VGA320200模式 SVGA高精度的640480、800600和1024768模式。 同样,可以利用BIOS设置高精度的SVGA图形显示模式。 SVGA利用VESA标准,就可以实现直接写屏(WindowsXP采用了VESA标准),第3章 高级编程技术的实现,图像技术:BMP图像的显示,VESA图形标准(在图形模式下): SVGA的VRAM是顺序的链结构,且图像数据是按行顺序存放的。一个像素用一个字节(256色)表示。 VRAM按字节连续寻址,与主机内存采用分页映射方式通讯,一次只能读写64KB的VRAM,通过改变段偏移量(I/O操作)来寻址不同的段。,第3章 高级编程技术的实现,图像技术:SVGA模式显示BMP图像实例,以256色640480 SVGA模式显示BMP图像。,应用实例,问题描述,第3章 高级编程技术的实现,图像技术:SVGA模式显示BMP图像实例,/*bmp文件头结构*/ typedef struct tagBITMAPFILEHEADER int bfType; /* 通常是 BM 。现在来看似乎判断OS/2的标识已无什么意义*/ long bfSize; /* 文件大小,以字

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1