SVGA图像处理研究论文
时间:2022-03-17 05:25:00
导语:SVGA图像处理研究论文一文来源于网友上传,不代表本站观点,若需要原创文章可咨询客服老师,欢迎参考。
svga彩色图形卡是一种超级vga卡,它不仅具有640×480×16色图像显示模式,而且具有640×480×256色图像显示模式。
microsoftc/c7.0提供了丰富的图形库函数,尤其是提供了对svga卡所能设置的高分辨率图像模式的支持,利用丰富的图形库函数进行组合,就可以完成各种需要的功能。例如图像处理,动画编程,界面制作等。这一点对编程者来说无疑是十分方便的。
然而遗憾的是许多图形库函数在一些特定的显示模式(如-vers256color(0x0101)方式(640×480×256)等256色模式)下却无法正常工作,例如使用例程-getimage()和-putimage()时常会出现死机和不能正常工作(出现雪花或不进行任何操作)等现象。用-grstatus()函数检测调用函数的状态时,返回图形错误或警告信息,常见的有图形错误(-1)和不支持请求的视频方式(-2)等,而这些函数在vga下工作正常。
根据vesa图形标准,在图像模式下,svga的videobuffer(视频缓冲区)是顺序的链结构,且图像数据是按行序顺序存放的,一个像素(屏幕上的一个点)用存储器的一个字节(256色)表示。视频存储器按字节连续寻址,与主机内存采用映射方式通讯,一次只能读写64kb的视频存储器,通过改变段偏移量(i/o操作)来寻址不同的段,即实现对全部视频存储器的操作。
同时,直接访问svga的寄存器进行读写操作,充分利用硬件的支持可以大大加快图形的处理速度。实践表明,其运行速度明显优于图形库中提供的函数(以-getimage()和-putimage()为例快30倍)。
笔者通过对视频存储器(videobuffer)的直接访问实现了256色图像显示模式下图像块的读写功能。下面附上在vesa标准的0x0101(256)图像显示模式下-getimage()和-putimage()两个函数的源程序,该源程序是用microsoftc/c7.0编写的。这两个函数在compaq486及兼容机上运行通过。
-getimage()和-putimage()两个函数的参数类型说明及意义与microsoftc/c7.0中相应函数的参数类型说明及意义相同。
/*将图像存储到缓冲区中*/
void-getimage256(x1,y1,x2,y2,image)
shortx1,y1,x2,y2;
char-huge*image;
{
char-far*buf,-huge*q;
longu;
shortm,n,i,j,block;
m=abs(x2-x1)1;
n=abs(y2-y1)1;
(short)*image=m;
(short)*(image2)=n;/*保留图像的高度与宽度*/
q=image4;
u=min(x1,x2);
u=min(y1,y2)*640l;
block=(short)(u/65536l);
u-=block*65536l;/*计算偏移量*/
-fp-seg(buf)=0xa000;
-fp-off(buf)=u;
-outp(0x3c4,14),
-outp(0x3c5,block^2);/*设置页寄存器*/
for(i=0;i<n;i,q=m){/*行循环*/
-memcpy(q,buf,m);
u=640;
if(u<65536l)buf=640;
else{/*当一行不在同一段时*/
u-=65536l;
-fp-seg(buf)=0xa000;
-fp-off(buf)=0;
block;
-outp(0x3c4,14);
-outp(0x3c5,block^2);
if(m>640-u)-memcpy(q640-u,buf,(size-t)(m-640u));
-fp-off(buf)=u;
}
}
}
/*在缓冲区中搜索图像*/
void-putimage256(x,y,image,action)
shortx,y,action;/*参数action表示图像写方式*/
char-huge*image;
{
char-far*buf,-huge*q;
longu;
shortm,n,j,i,block,mm;
-memcpy(&mm,image,2);
if((xmm)>640)m=640-x;
elsem=mm;
-memcpy(&n,image2,2);
if(yn>480)n=480-n;/*取图像的高度和宽度,并进行边界处理*/
q=image4;
u=x;
u=y*640l;
block=(short)(u/65536l);
u-=block*65536l;
-fp-seg(buf)=0xa000;
-fp-off(buf)=u;
-outp(0x3c4,14);
-outp(0x3c5,block^2);
for(i=0;i<n;i,q=mm){
if(action==-gpset)-memcpy(buf,q,m);
elseif(action==-gor)for(j=0;j<m;j)*(bufj)|=(*(qj));
elseif(action==-gand)for(j=0;j<m;j)*(bufj)&=(*(qj));
elseif(action==-gxor)for(j=0;j<m;j)*(bufj)^=(*(qj));
elseif(action==-gpreset)for(j=0;j<m;j)*(bufj)=~(*(qj));
u=640;
if(u<65536l)buf=640;
else{
u-=65536l;-fp-seg(buf)=0xa000;
-fp-off(buf)=0;
block;
-outp(0x3c4,14);
-outp(0x3c5,block^2);
if(m>640-u){
if(action==-gpset)-memcpy(buf,q640-u,(size-t)(m-640u));
elseif(action==-gor)
for(j=0;j<m-640u;j)*(bufj)|=(*(q640-uj));
elseif(action==-gand)
for(j=0;j<m-640u;j)*(bufj)&=(*(q640-uj));
elseif(action==-gxor)
for(j=0;j<m-640u;j)*(bufj)^=(*(q640-uj));
elseif(action==-gpreset)
for(j=0;j<m-640u;j)*(bufj)=~(*(q640-uj));
}
-fp-off(buf)=u;
}
}
}
- 上一篇:NetWare与UNI互联方法研究论文
- 下一篇:CD-ROM编程研究论文