VGA16色模式下的图像漫游_第1页
VGA16色模式下的图像漫游_第2页
VGA16色模式下的图像漫游_第3页
VGA16色模式下的图像漫游_第4页
VGA16色模式下的图像漫游_第5页
已阅读5页,还剩10页未读, 继续免费阅读

下载本文档

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

文档简介

1、VGA16色形式下的图像遨游vga是微机显示的廉价适配器,因此在其上实现图形图像处理的本钱较低。在目前国内流行的语言中,均提供了根本的作图函数,如brland+、turb和irsft。但还缺少一个最根本的图形图像处理功能-屏幕遨游功能。本文将讨论在vga16色形式下实现屏幕图像遨游的方法,并给出语言的程序供读者参考。一、根本构思为了实现遨游的功能,首先将想像中的大幅图像分成nn块(每块应小于屏幕的分辨率)一样大小的区域,然后逐次显示在屏幕上并存放到一个文件中。这样就完成了遨游图的制作。可以设想,文件提供了一个无限分辨率的虚拟屏幕,存储着大幅图像数据。在调用遨游图时,将存放在文件中的图像数据的一

2、局部显示在屏幕上,当用键盘或鼠标控制图像遨游时,程序首先将屏幕上的图像挪动一定的间隔 ,这一过程本质是硬件遨游。当屏幕图像挪动后,留出的空白位置那么从文件中调出数据显示到屏幕上,这一步本质为软件遨游。二、存图文件的数据构造假设在文件z.sr中存储了22个vga(64048016色形式)窗口画面,窗口的范围如图1所示。其左上角和右下角的坐标分别为(xp1,yp1)、(xp2,yp2),将来就在这一窗口范围内进展遨游。t5s11100.gif;图1假设存图时每个窗口大小一样,高度为d,宽度为。存图时遨游窗口的宽度与起始坐标均为8的整数倍,这样便于处理。四个窗口的排号顺序如图2所示:t5s11101

3、.gif;图2在此是实现22画面的遨游功能,用户可根据需要实现nn个画面的遨游,其方法一样。三、根本功能函数实现遨游功能主要由以下几个函数实现savein存图函数,将屏幕窗口函数存入文件。ladin调图函数,由文件将图像数据调入屏幕。srll_xx轴向遨游函数。srll_yy轴向遨游函数。1.常数定义及函数说明/*文件名:srll.h*+/#definexp116/*窗口左上角坐标*/#defineyp132#definexp2591/*窗口右下角坐标*/#defineyp2415#defineleft0 x4b#defineright0 x4b#defineup0 x48#definedn0

4、 x50#defineindexreg10 x3e/*vga图形控制器索引存放器*/#definevalreg10 x3f/*vga图形控制器数据存放器*/#defineindexreg20 x34/*vga定序器索引存放器*/#definevalreg20 x35/*vga定序器数据存放器*/#definevgabase0 xa0000000l/*vga640*48016色形式起始地址*/vidsavein(har*,int,int,int,int,int,int);vidladin(har*,int,int,int,int,int,int,int);vidsrll_x(int,int,in

5、t,int,int);vidsrll_y(int,int,int,int,int)2、功能函数/*文件名:funtin.pp*/#inludestdi.h#inludestdlib.h#inludeni.h#inludesrll.h/*制作遨游图时存入窗口函数,fnae存放遨游图文件;(xleft,ytp)在屏幕上窗口左上角坐标;(xright,ybutt)在屏幕上窗口左上角坐标;nuber图号(0-nxynxy-1)nxynxy*nxy拼图*/vidsavein(har*fnae,intxleft,intytp,intxright,intybutt,intnuber,intnxy)file*

6、fp;inti,idth,height;registerj,k;lngtep,ffset,ffset1;harfar*base;idth=(xright-xleft+1)/8;height=ybutt-ytp+1;fp=fpen(fnae,rb+);ffset=(lng)(nuber-nuber%nxy)*(lng)idth*(lng)height;ffset1=ffset;fr(i=0;i4;i+)utprtb(indexreg1,4);utprtb(valreg1,i);base=(harfar)*vgabase+(lng)(ytp*80)+(lng)(xleft/8);ffset=(ln

7、g)(i*nxy*nxy)*(lng)idth*(lng)height+(lng)(nuber%nxy)*(lng)idth+ffset1;fr(j=0;jheight;j+)fseek(fp,ffset,seek_set);frite(base,1,idth,fp);ffset=ffset+(lng)(nxy*idth);base=base+80l;flse(fp);utprtb(indexreg1,0);/*向屏幕装入遨游图窗口函数,(x0,y0)装入屏幕起始坐标;fnae存放遨游图文件名;(xleft,ytp)在fnae中虚拟窗口左上角坐标;(xright,ybutt)在fnae中虚拟窗

8、口右下角坐标;nxynxy*nxy拼图*/vidladin(har*fnae,intx,inty0,intxleft,intytp,intxright,intybutt,intnxy)file*fp;registerintj,i,n=8,idth,height;harfar*base,*vbase;registerlngffset;fp=fpen(fnae,rb);idth=(xright-xleft+1)/8;height=ybutt-ytp+1;fr(i=3;i0;i-)utprtb(indexreg1,5);utprtb(valreg1,0);utprtb(indexreg2,2);ut

9、prtb(valreg2,n);base=(harfar*)vgabase+(lng)y080l+(lng)(x0/8);ffset=(lng)(i*nxy*nxy)*(lng)(yp2-yp1+1)*(lng)(xp2-xp1+1)/8)+(lng)(xleft/8)+(lng)(ytp*nxy)*(lng)(xp2-xp1+1)/8);fr(j=0;jheight;j+)fseek(fp,ffset,seek_set);fread(base,1,idth,fp);ffset=ffset+(lng)nxy*(lng)(xp2-xp1+1)/8);base=base+80l;n=n/2;fls

10、e(fp);utprtb(valreg2,xff);utprtb(indexreg2,xf);utprtb(indexreg1,0);/*y-方向遨游函数(xleft,ytp,xright,ybutt)定义遨游窗口;dy向上遨游(以象素为单位);dy向下遨游(以象素为单位)*/vidsrll-y(intxleft,intytp,intxright,intybutt,intdy)intidth,height,tep;registeri,j;harfar*base,far*tbase;lngffset,tffset;utprtb(indexerg1,5);utprtb(valreg1,1);idt

11、h=(xright-xleft+1)/8;height=ybutt-ytp+1;if(dy0)base=(harfar*)vgabase+(lng)(ytp*80)+(lng)(xleft/8);tbase=base;tffset=(lng)dy*80l;tep=height+dy;/*henvetupdy0*/fr(i=0;itep;i+)fr(j=0;jidth;j+)*base=*(base-tffset);base+;tbase=tbase+80l;base=tbase;elsebase=(harfar*)vgabase+(lng)(ybutt*80)+(lng)(xleft/8);t

12、base=base;tffset=(lng)dy*80l;tep=height-dy;/*dy0*/fr(i=0;itep;i+)fr(j=0;jidth;j+)*base=*(base-tffset);base+;tbase=tbase-80l;base=tbase;utprtb(indexreg1,0);/*x-方向遨游函数(xleft,ytp,xright,ybutt)定义遨游窗口;dx0向左遨游(以8个象素为单位);dx0向右遨游(以8个象素为单位)*/vidsrll-x(intxleft,intytp,intxright,intybutt,intdx)intidth,height,t

13、ep;registeri,j;harfar*base,far*tbase;lngffset;utprtb(indexreg1,5);utprtb(valreg1,1);idth=(xright-xleft+1)/8;height=ybutt-ytp+1;if(dx0)base=(harfar*)vgabase+(lng)(ytp*80)+(lng)(xleft/8);tbase=base;tep=idth+dx;/*henvetleftdx0*/fr(i=0;iheight;i+)fr(j=0;jtep;j+)*base=*(base-dx);base+;tbase=tbase+80l;bas

14、e=tbase;elsebase=(harfar*)vgabase+(lng)(ytp*80)+(lng)(xright-7)/8;tbase=base;tep=idth-dx;/*dx0*/fr(i=0;iheight;i+)fr(j=0;jtep;j+)*base=*(base-dx);base-;tbase=tbase+80l;base=tbase;utprtb(indexreg1,0);四、例如例如ex1.pp中,首先在虚拟的大幅遨游图上画一个贯穿整个遨游图的“,然后按22图幅存入z.sr文件。在例如ex2.pp中,通过方向键控制图像遨游。程序1ex1.pp#inludestdi.h#

15、inludestdlib.h#inludeni.h#inludeds.h#inludegraphi.h#inludesrll.hvikdain(vid)file*fp;harh;harfar*ptr;intx1,y1,x2,y1;intgdriver=detet,gde;initgraph(gdriver,*gde,);setlr(red);line(xp1,yp1,xp2,yp2);savein(z.sr,xp1,yp1,xp2,yp2,1,2);leardevie();line(xp1,yp1,xp2,yp2);savein(z.sr,xp1,yp1,xp2,yp2,4,2);learde

16、vie();line(xp2,yp1,xp1,yp2);savein(z.sr,xp1,yp1,xp2,yp2,2,2);leardevie();line(xp2,yp1,xp1,yp2);savein(z.sr,xp1,yp1,xp2,yp2,3,2);lsegraph();程序2ex2.pp#inludestdi.h#inludestdlib.h#inludeni.h#inludeds.h#inludegraphi.h#inludesrll.hintdx=0,dy=0;vidain(vid)file*fp;harh;harfar*ptr;intgdriver=detet,gde;initg

17、raph(gdriver,*gde,);/*将存贮在z.sr中对应的左上角的局部图像装入屏幕窗口*/ladin(z.sr,xp1,yp1,0,0,xp2-xp1,yp2-yp1,2);/*以下循环利用方向键控制图像遨游,“q键退出*/dh=geth();if(h=0)h=geth();if(h=q|h=q)break;sith(h)asedn:/*向下滚动64行*/if(dy0)dy-;srll-y(xp1,yp1,xp2,yp2,64);ladin(z.sr,xp1,yp1,64*dx,64*dy,xp2-xp1+64*dx,64*(dy+1)-1,2)break;aseup:/*向上滚动64行*/if(dy(yp2-yp1+1)/64)srll-y(xp1,yp1,xp2,yp2,-64);ladin(z.sr,xp1,yp2-63,64*dx,yp2-yp1+1+64*dy,xp2-xp1+64*dx,yp2-yp1+64*(dy+1),2);dy+;break;ase

温馨提示

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

评论

0/150

提交评论