收藏 分销(赏)

VGA16色模式下的图像漫游.docx

上传人:快乐****生活 文档编号:4592401 上传时间:2024-09-30 格式:DOCX 页数:17 大小:16.33KB 下载积分:8 金币
下载 相关 举报
VGA16色模式下的图像漫游.docx_第1页
第1页 / 共17页
VGA16色模式下的图像漫游.docx_第2页
第2页 / 共17页


点击查看更多>>
资源描述
VGA16色模式下的图像漫游   VGA是微机显示的廉价适配器,因而在其上实现图形图像处理的成本较低。在目前国内流行的C语言中,均提供了基本的作图函数,如Borlandc C++、Turbo C和MicrosoftC。但还缺少一个最基本的图形图像处理功能-屏幕漫游功能。本文将讨论在VGA16色模式下实现屏幕图像漫游的方法,并给出C语言的程序供读者参考。 一、基本构思 为了实现漫游的功能,首先将想像中的大幅图像分成N×N块(每块应小于屏幕的分辨率)相同大小的区域,然后逐次显示在屏幕上并存放到一个文件中。这样就完成了漫游图的制作。可以设想,文件提供了一个无限分辨率的虚拟屏幕,存储着大幅图像数据。 在调用漫游图时,将存放在文件中的图像数据的一部分显示在屏幕上,当用键盘或鼠标控制图像漫游时,程序首先将屏幕上的图像移动一定的距离,这一过程实质是硬件漫游。当屏幕图像移动后,留出的空白位置则从文件中调出数据显示到屏幕上,这一步实质为软件漫游。 二、存图文件的数据结构 假设在文件中存储了2×2个VGA(640×480×16色模式)窗口画面,窗口的范围如图1所示。其左上角和右下角的坐标分别为(XP1,YP1)、(XP2,YP2),将来就在这一窗口范围内进行漫游。 @@;图1@@ 假设存图时每个窗口大小一样,高度为d,宽度为w。存图时漫游窗口的宽度与起始坐标均为8的整数倍,这样便于处理。四个窗口的排号顺序如图2所示: @@;图2@@ 在此是实现2×2画面的漫游功能,用户可根据需要实现n×n个画面的漫游,其方法相同。 三、基本功能函数 实现漫游功能主要由以下几个函数实现 savewin——存图函数,将屏幕窗口函数存入文件。 Loadwin——调图函数,由文件将图像数据调入屏幕。 scroll_x——X轴向漫游函数。 scroll_y——Y轴向漫游函数。 1.常数定义及函数说明 /*文件名:*+/ # define XP1 16 /* 窗口左上角坐标 */ # define YP1 32 # define XP2 591 /* 窗口右下角坐标*/ # define YP2 415 # define LEFT 0x4b # define RIGHT 0x4b # define UP 0x48 # define DOWN 0x50 # define INDEXREG1 0x3CE /* VGA图形控制器索引寄存器 */ # define VALREG1 0x3CF /* VGA图形控制器数据寄存器 */ # define INDEXREG2 0x3C4 /* VGA定序器索引寄存器*/ # define VALREG2 0x3C5 /* VGA定序器数据寄存器 */ ·# define VGABASE 0xA0000000L /* VGA 640*480 16色模式起始地址 */ void savewin (char *,int,int,int,int,int,int); void Loadwin (char *,int,int,int,int,int,int,int); void scroll_x (int,int,int,int,int); void scroll_y (int,int,int,int,int) 2、功能函数 /* 文件名:*/ # include # include # include # include "" /*制作漫游图时存入窗口函数, fname存放漫游图文件; (xleft,ytop)在屏幕上窗口左上角坐标; (xright,ybuttom)在屏幕上窗口左上角坐标; number图号(0-nxy×nxy-1) nxy nxy*nxy拼图*/ void savewin(char *fname,int xleft,int ytop,int xright,int ybuttom,int nu mber,int nxy) { FILE *fp; int i,width,height; register j,k; Long temp,offset,offset1; char far *base; width=(xright-xleft+1)/8; height=ybuttom-ytop+1; fp=fopen(fname,"rb+"); offset=(Long)(number-number%nxy)*(long)width*(long)height; offset1=offset; for(i=0;i4;i++) { outportb(INDEXREG1,4); outportb(VALREG1,i); base=(char far)*VGABASE+(long)(ytop*80)+(long)(xleft/8); offset=(long)(i*nxy*nxy)*(long)width*(long)height+(long)(number%nxy)*(l ong)width+offset1; for(j=0;jheight;j++) { fseek(fp,offset,SEEK_SET); fwrite(base,1,width,fp); offset=offset+(long)(nxy*width); base=base+80L; } } fclose(fp); outportb(INDEXREG1,0); } /* 向屏幕装入漫游图窗口函数, (x0,y0)装入屏幕起始坐标; fname存放漫游图文件名; (xleft,ytop)在fname中虚拟窗口左上角坐标; (xright,ybuttom)在fname中虚拟窗口右下角坐标; nxynxy*nxy拼图*/ void Loadwin(char *fname,int xo,int y0,int xleft,int ytop,int xright,int ybuttom,int nxy) { FILE *fp; register int j,i,n=8,width, height; char far *base,*vbase; register long offset; fp=fopen(fname,"rb"); width=(xright-xleft+1)/8; height=ybuttom-ytop+1; for(i=3;i0;i--) { outportb(INDEXREG1,5); outportb(VALREG1,0); outportb(INDEXREG2,2); outportb(VALREG2,n); base=(char far*)VGABASE+(long)y0×80L+(long)(x0/8); offset=(long)(i*nxy*nxy)*(long)(YP2-YP1+1)*(long)((XP2-XP1+1)/8)+(long)(x left/8)+(long)(ytop*nxy)*(long)((XP2-XP1+1)/8); for(j=0;jheight;j++) { fseek(fp,offset,SEEK_SET); fread(base,1,width,fp); offset=offset+(long)nxy*(long)((XP2-XP1+1)/8); base=base+80L; } n=n/2; } fclose(fp); outportb(VALREG2,oxff); outportb(INDEXREG2,oxf); outportb(INDEXREG1,0); } /* Y-方向漫游函数 (xleft,ytop,xright,ybuttom)定义漫游窗口; dy向上漫游(以象素为单位); dy向下漫游(以象素为单位)*/ void scroll-y(int xleft,int ytop,int xright,int ybuttom,int dy) { int width,height,temp; register i,j; char far *base,far *tbase; long offset,toffset; outportb(INDEXERG1,5); outportb(VALREG1,1); width=(xright-xleft+1)/8; height=ybuttom-ytop+1; if(dy0){   base=(char far *)VGABASE+(long)(ytop*80)+(long)(xleft/8); tbase=base; toffset=(long)dy*80L; temp=height+dy; /* when move to up dy0 */ for(i=0;itemp;i++){ for(j=0;jwidth;j++){ *base=*(base-toffset); base++; } tbase=tbase+80L; base=tbase; } } else { base=(char far *)VGABASE+(long)(ybuttom*80)+(long)(xleft/8); tbase=base; toffset=(long)dy*80L; temp=height-dy; /*dy0 */ for(i=0;itemp;i++){ for(j=0;jwidth;j++){ *base=*(base-toffset); base++; } tbase=tbase-80L; base=tbase; } } outportb(INDEXREG1,0); } /* X-方向漫游函数 (xleft,ytop, xright,ybuttom)定义漫游窗口; dx0 向左漫游(以8个象素为单位); dx0 向右漫游(以8个象素为单位) */ void scroll-x(int xleft,int ytop,int xright,int ybuttom,int dx) { int width,height,temp; register i,j; char far *base,far *tbase; long offset; outportb(INDEXREG1,5); outportb(VALREG1,1); width=(xright-xleft+1)/8; height=ybuttom-ytop+1; if(dx0) { base=(char far *)VGABASE+(long)(ytop*80)+(long)(xleft/8); tbase=base; temp=width+dx; /* when move to left dx0 */ for(i=0;iheight;i++) { for(j=0;jtemp;j++) { *base=*(base-dx); base++; } tbase=tbase+80L; base=tbase; } } else { base=(char far *)VGABASE+(long)(ytop*80)+(long)((xright-7)/8; tbase=base; temp=width-dx; /* dx0 */ for(i=0;iheight;i++) { for(j=0;jtemp;j++) { *base=*(base-dx); base--; } tbase=tbase+80L; base=tbase; } } outportb(INDEXREG1,0); } 四、示例 示例中,首先在虚拟的大幅漫游图上画一个贯穿整个漫游图的“×”,然后按2×2 图幅存入文件。在示例中,通过方向键控制图像漫游。 [程序1] # # # # # # include"" voikd main(void) { FILE *fp; char ch; char far *ptr; int X1,Y1,X2,Y1; int gdriver=DETECT,gmode; initgraph(&gdriver,*gmode,""); setcolor(RED); line(XP1,YP1,XP2,YP2); savewin("",XP1,YP1,XP2,YP2,1,2); cleardevice(); line(XP1,YP1,XP2,YP2); savewin("",XP1,YP1,XP2,YP2,4,2); cleardevice(); line(XP2,YP1,XP1,YP2); savewin("",XP1,YP1,XP2,YP2,2,2); cleardevice(); line(XP2,YP1,XP1,YP2); savewin("",XP1,YP1,XP2,YP2,3,2); closegraph(); } [程序2] # # # # # # include"" int mdx=0,mdy=0; void main(void) { FILE *fp; char ch; char far *ptr; int gdriver=DETECT,gmode; initgraph(&gdriver,*gmode,""); /* 将存贮在中对应的左上角的部分图像装入屏幕窗口 */ loadwin("",xp1,yp1,0,0,XP2-XP1,YP2-YP1,2); /* 以下循环利用方向键控制图像漫游,“Q”键退出*/ do { ch=getch(); if(ch==0) ch=getch(); if(ch=="Q"||ch=="q") break; switch(ch){ case DOWN: /* 向下滚动64行*/ if (mdy0) { mdy--; scroll-y(XP1,YP1,XP2,YP2,64); loadwin("",XP1,YP1,64*mdx,64*mdy,XP2-XP1+64*mdx,64*(mdy+1)- 1,2) } break; case UP: /* 向上滚动64行 */ if (mdy(YP2-YP1+1)/64) { scroll-y(XP1,YP1,XP2,YP2,-64); loadwin("",XP1,YP2-63,64*mdx,YP2-YP1+1+64*mdy,XP2-XP1+64*mdx ,YP2-YP1+64*(mdy+1),2); mdy++; } break; case LEFT: if(mdy(XP2-XP1+1)/64) { scroll-x(XP1,Pp1,XP2,YP2,-8); loadwin("",XP2-63,YP1,XP2-XP1+1+64*mdx,64*mdy,XP2-XP1+64*(m dx+1),YP2-YP1+64*mdy,2); mdx++; } break; case RIGHT: if (mdx0) { mdx--; scroll-x(XP1,YP1,XP2,YP2,8); loadwin("",XP1,YP1,64*mdx,64*mdy,64*(mdx+1)-1,YP2-YP1+64*md y,2); } break; } while(ch!=‘Q‘); closegraph(); }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服