SVGA圖像處理研究論文
時(shí)間:2022-03-17 05:25:00
導(dǎo)語:SVGA圖像處理研究論文一文來源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。
svga彩色圖形卡是一種超級(jí)vga卡,它不僅具有640×480×16色圖像顯示模式,而且具有640×480×256色圖像顯示模式。
microsoftc/c7.0提供了豐富的圖形庫函數(shù),尤其是提供了對(duì)svga卡所能設(shè)置的高分辨率圖像模式的支持,利用豐富的圖形庫函數(shù)進(jìn)行組合,就可以完成各種需要的功能。例如圖像處理,動(dòng)畫編程,界面制作等。這一點(diǎn)對(duì)編程者來說無疑是十分方便的。
然而遺憾的是許多圖形庫函數(shù)在一些特定的顯示模式(如-vers256color(0x0101)方式(640×480×256)等256色模式)下卻無法正常工作,例如使用例程-getimage()和-putimage()時(shí)常會(huì)出現(xiàn)死機(jī)和不能正常工作(出現(xiàn)雪花或不進(jìn)行任何操作)等現(xiàn)象。用-grstatus()函數(shù)檢測(cè)調(diào)用函數(shù)的狀態(tài)時(shí),返回圖形錯(cuò)誤或警告信息,常見的有圖形錯(cuò)誤(-1)和不支持請(qǐng)求的視頻方式(-2)等,而這些函數(shù)在vga下工作正常。
根據(jù)vesa圖形標(biāo)準(zhǔn),在圖像模式下,svga的videobuffer(視頻緩沖區(qū))是順序的鏈結(jié)構(gòu),且圖像數(shù)據(jù)是按行序順序存放的,一個(gè)像素(屏幕上的一個(gè)點(diǎn))用存儲(chǔ)器的一個(gè)字節(jié)(256色)表示。視頻存儲(chǔ)器按字節(jié)連續(xù)尋址,與主機(jī)內(nèi)存采用映射方式通訊,一次只能讀寫64kb的視頻存儲(chǔ)器,通過改變段偏移量(i/o操作)來尋址不同的段,即實(shí)現(xiàn)對(duì)全部視頻存儲(chǔ)器的操作。
同時(shí),直接訪問svga的寄存器進(jìn)行讀寫操作,充分利用硬件的支持可以大大加快圖形的處理速度。實(shí)踐表明,其運(yùn)行速度明顯優(yōu)于圖形庫中提供的函數(shù)(以-getimage()和-putimage()為例快30倍)。
筆者通過對(duì)視頻存儲(chǔ)器(videobuffer)的直接訪問實(shí)現(xiàn)了256色圖像顯示模式下圖像塊的讀寫功能。下面附上在vesa標(biāo)準(zhǔn)的0x0101(256)圖像顯示模式下-getimage()和-putimage()兩個(gè)函數(shù)的源程序,該源程序是用microsoftc/c7.0編寫的。這兩個(gè)函數(shù)在compaq486及兼容機(jī)上運(yùn)行通過。
-getimage()和-putimage()兩個(gè)函數(shù)的參數(shù)類型說明及意義與microsoftc/c7.0中相應(yīng)函數(shù)的參數(shù)類型說明及意義相同。
/*將圖像存儲(chǔ)到緩沖區(qū)中*/
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;/*計(jì)算偏移量*/
-fp-seg(buf)=0xa000;
-fp-off(buf)=u;
-outp(0x3c4,14),
-outp(0x3c5,block^2);/*設(shè)置頁寄存器*/
for(i=0;i<n;i,q=m){/*行循環(huán)*/
-memcpy(q,buf,m);
u=640;
if(u<65536l)buf=640;
else{/*當(dāng)一行不在同一段時(shí)*/
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;
}
}
}
/*在緩沖區(qū)中搜索圖像*/
void-putimage256(x,y,image,action)
shortx,y,action;/*參數(shù)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;/*取圖像的高度和寬度,并進(jì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;
}
}
}