欢迎光临112期刊网!
网站首页 > 论文范文 > 计算机论文 > 计算机应用 > VGA16色模式下的图像漫游

VGA16色模式下的图像漫游

日期:2023-01-24 阅读量:0 所属栏目:计算机应用


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.常数定义及函数说明
/*文件名:scroll.h*+/
# 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 "scroll.h"
/*制作漫游图时存入窗口函数,
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;i<4;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;jfseek(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;i>0;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;jfseek(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(dy<0){

base=(char far *)vgabase+(long)(ytop*80)+(long)(xleft/8);
tbase=base;
toffset=(long)dy*80l;
temp=height+dy; /* when move to up dy<0 */
for(i=0;ifor(j=0;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; /*dy>0 */
for(i=0;ifor(j=0;j*base=*(base-toffset);
base++;
}
tbase=tbase-80l;
base=tbase;
}
}
outportb(indexreg1,0);
}
/* x-方向漫游函数
(xleft,ytop, xright,ybuttom)定义漫游窗口;
dx<0 向左漫游(以8个象素为单位);
dx>0 向右漫游(以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(dx<0) {
base=(char far *)vgabase+(long)(ytop*80)+(long)(xleft/8);
tbase=base;
temp=width+dx; /* when move to left dx<0 */
for(i=0;ifor(j=0;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; /* dx>0 */
for(i=0;ifor(j=0;j*base=*(base-dx);
base--;
}
tbase=tbase+80l;
base=tbase;
}
}
outportb(indexreg1,0);
}
四、示例
示例中,首先在虚拟的大幅漫游图上画一个贯穿整个漫游图的“×”,然后按2×2
图幅存入文件。在示例中,通过方向键控制图像漫游。
[程序1]
# include
# include
# include
# include
# include
# include"scroll.h"
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
# include
# include
# include
# include
# include"scroll.h"
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 (mdy>0) {
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 (mdx>0) {
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();
} 本文链接:http://www.qk112.com/lwfw/jsjlw/jisuanjiyingyong/244287.html

论文中心更多

发表指导
期刊知识
职称指导
论文百科
写作指导
论文指导
论文格式 论文题目 论文开题 参考文献 论文致谢 论文前言
教育论文
美术教育 小学教育 学前教育 高等教育 职业教育 体育教育 英语教育 数学教育 初等教育 音乐教育 幼儿园教育 中教教育 教育理论 教育管理 中等教育 教育教学 成人教育 艺术教育 影视教育 特殊教育 心理学教育 师范教育 语文教育 研究生论文 化学教育 图书馆论文 文教资料 其他教育
医学论文
医学护理 医学检验 药学论文 畜牧兽医 中医学 临床医学 外科学 内科学 生物制药 基础医学 预防卫生 肿瘤论文 儿科学论文 妇产科 遗传学 其他医学
经济论文
国际贸易 市场营销 财政金融 农业经济 工业经济 财务审计 产业经济 交通运输 房地产经济 微观经济学 政治经济学 宏观经济学 西方经济学 其他经济 发展战略论文 国际经济 行业经济 证券投资论文 保险经济论文
法学论文
民法 国际法 刑法 行政法 经济法 宪法 司法制度 法学理论 其他法学
计算机论文
计算机网络 软件技术 计算机应用 信息安全 信息管理 智能科技 应用电子技术 通讯论文
会计论文
预算会计 财务会计 成本会计 会计电算化 管理会计 国际会计 会计理论 会计控制 审计会计
文学论文
中国哲学 艺术理论 心理学 伦理学 新闻 美学 逻辑学 音乐舞蹈 喜剧表演 广告学 电视电影 哲学理论 世界哲学 文史论文 美术论文
管理论文
行政管理论文 工商管理论文 市场营销论文 企业管理论文 成本管理论文 人力资源论文 项目管理论文 旅游管理论文 电子商务管理论文 公共管理论文 质量管理论文 物流管理论文 经济管理论文 财务管理论文 管理学论文 秘书文秘 档案管理
社科论文
三农问题 环境保护 伦理道德 城镇建设 人口生育 资本主义 科技论文 社会论文 工程论文 环境科学