高級編程技術的實現(xiàn).ppt_第1頁
高級編程技術的實現(xiàn).ppt_第2頁
高級編程技術的實現(xiàn).ppt_第3頁
高級編程技術的實現(xiàn).ppt_第4頁
高級編程技術的實現(xiàn).ppt_第5頁
已閱讀5頁,還剩145頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第3章 高級編程技術的實現(xiàn),操作手段 顯示方式 圖形繪制技術 圖像技術 動畫技術 發(fā)聲技術 漢字顯示技術 精確的時間控制技術,1,第3章 高級編程技術的實現(xiàn),操作手段:鍵盤,在鍵盤內(nèi)有一個微處理器,用來掃描和檢測每個鍵的按下和抬起狀態(tài),然后以程序中斷(INT 9H)的方式與主機通信,向主機傳送一個字節(jié)的按鍵掃描碼。接著ROM中BIOS內(nèi)的鍵盤中斷處理程序,將按鍵掃描碼翻譯成對應的ASCII碼或擴充的ASCII碼,存放在AX寄存器中。,原理,2,第3章 高級編程技術的實現(xiàn),操作手段:鍵盤,方法,方法一:直接使用聲明在bios.h中的庫函數(shù)bioskey(); 方法二:通過庫函數(shù)int86(),調(diào)用BIOS的INT 16H、功能 號為0的中斷。它將按鍵的掃描碼存放在AH寄存器 中; 方法三:簡單地利用聲明在conio.h中的庫函數(shù)kbhit()。,3,第3章 高級編程技術的實現(xiàn),操作手段:鍵盤,方法一,int bioskey(int cmd);/*參數(shù)cmd用來確定函數(shù)如何操作*/,cmd=0 bioskey()返回按健的鍵值,該值是2個字節(jié)的整型數(shù)。若沒有鍵按下,則該函數(shù)一直等待,直到有鍵按下。當按下時,若返回值的低8位為非零,則表示為普通鍵,其值代表該鍵的ASCII碼。若返回值的低8位為0,則高8位表示為擴展的ASCII碼,表示按下的是特殊功能鍵,4,第3章 高級編程技術的實現(xiàn),操作手段:鍵盤,方法一,int bioskey(int cmd);/*參數(shù)cmd用來確定函數(shù)如何操作*/,cmd=1 bioskey()查詢是否有鍵按下。若返回非0值,則表示有鍵按下,若為0表示沒鍵按下。,5,第3章 高級編程技術的實現(xiàn),操作手段:鍵盤,方法一,int bioskey(int cmd);/*參數(shù)cmd用來確定函數(shù)如何操作*/,cmd=2 bioskey()將返回一些控制鍵是否被按過,按過的狀態(tài)由該函數(shù)返回的低8位的各位值來表示: 字節(jié)位 對應的16進制數(shù) 含義 0 0x01 右邊的shift鍵被按下 1 0x02 左邊的shift鍵被按下 2 0x04 Ctrl鍵被按下 3 0x08 Alt鍵被按下 4 0x10 Scroll Lock已打開 5 0x20 Num Lock已打開 6 0x40 Caps Lock已打開 7 0x80 Insert已打開,6,第3章 高級編程技術的實現(xiàn),操作手段:鍵盤,方法二,/* 讀鍵函數(shù),返回掃描碼 */ int getKeySCode() union REGS rg; rg.h.ah=0; int86(0x16, ,7,鍵盤掃描碼表見課程主頁,第3章 高級編程技術的實現(xiàn),操作手段:鍵盤,方法三,int kbhit(void); 若按了鍵盤,該函數(shù)返回值1,否則返回值0。,8,第3章 高級編程技術的實現(xiàn),操作手段:鼠標,DOS操作系統(tǒng)和Turbo C 2.0并不支持鼠標器的操作。要操縱鼠標器,首先必須安裝相應的鼠標驅(qū)動程序。鼠標驅(qū)動程序由生產(chǎn)鼠標的廠家提供,它提供了許多鼠標操作的功能。這些功能可以通過INT 33H鼠標中斷調(diào)用來使用。,原理,9,第3章 高級編程技術的實現(xiàn),操作手段:鼠標常用功能,/* 顯示鼠標器光標 */ void cursorOn() union REGS r; struct SREGS s; r.x.ax1; /* 1號鼠標器功能:顯示鼠標光標 */ msvisibleTRUE; int86x(0x33,&r,&r,&s); ,10,第3章 高級編程技術的實現(xiàn),/* 關閉鼠標器光標 */ void cursorOff() union REGS r; struct SREGS s; r.x.ax2; /* 2號鼠標器功能 :不顯示鼠標光標 */ msvisibleFALSE; int86x(0x33,&r,&r,&s); ,操作手段:鼠標常用功能,11,第3章 高級編程技術的實現(xiàn),/*設定鼠標光標的初始位置*/ void cursorXY(unsigned int x, unsigned int y) union REGS r; struct SREG s; r.x.ax=4; /* 4號鼠標器功能:設置鼠標光標位置 */ r.x.cx=x; /* 設定光標x坐標 */ r.x.dx=y; /* 設定光標y坐標 */ int86x(0x33, ,操作手段:鼠標常用功能,12,第3章 高級編程技術的實現(xiàn),/*報告鼠標器當前光標位置和當前按鍵狀態(tài)*/ void mouseRead() union REGS rl,r2; struct SREGS s; r1.x.ax=3; /* 3號鼠標器功能:取按鈕狀態(tài)和鼠標位置 */ int86x(0x33, /* 鼠標器按健狀態(tài) */ ,操作手段:鼠標常用功能,13,第3章 高級編程技術的實現(xiàn),/*等待鼠標器的某種狀態(tài)*/ void wait(int i) do mouseread(); while(mousekey=i); ,操作手段:鼠標常用功能,14,第3章 高級編程技術的實現(xiàn),操作手段 顯示方式 圖形繪制技術 圖像技術 動畫技術 發(fā)聲技術 漢字顯示技術 精確的時間控制技術,15,第3章 高級編程技術的實現(xiàn),顯示方式:顯示系統(tǒng),顯 卡,16,第3章 高級編程技術的實現(xiàn),顯示方式:顯示系統(tǒng),常見顯卡及其模式,17,第3章 高級編程技術的實現(xiàn),顯示方式:顯示系統(tǒng),顯示器工作方式,顯示器有兩種工作方式,即文本顯示方式和圖形顯示方式,它們的主要差別是顯示存儲器(VRAM)中存的信息不同。文本方式時,VRAM存放要顯示字符的ASCII碼,用它作為地址,取出字符發(fā)生器ROM中存放的相應字符的圖像變成視頻信號在顯示器屏幕上進行顯示。圖形方式時,則要顯示的圖形的圖像直接存在VRAM中,VRAM中某地址單元存放的數(shù)就表示了相應屏幕上某行和列上的像素及顏色。,18,第3章 高級編程技術的實現(xiàn),顯示方式:,也稱作字符顯示方式,是Turbo C確省的顯示方式。文本方式屏幕的最大分辨單位是單個字符,字符顯示的位置用行和列坐標來表示。,文本方式,19,第3章 高級編程技術的實現(xiàn),顯示方式:文本方式方式設定,Turbo C支持的幾種文本顯示方式可以用下面的函數(shù)來設置: void textmode(int newmode);。,20,第3章 高級編程技術的實現(xiàn),顯示方式:文本方式顏色設置,21,第3章 高級編程技術的實現(xiàn),顯示方式:文本方式窗口設置,Turbo C確省定義的文本窗口為整個屏幕。用戶可以通過函數(shù): void window(int left, int top, int right, int bottom); 定義屏幕上的一個矩形域作為窗口。參數(shù)(left,top)是窗口左上角所在的屏幕坐標,(right,bottom)是窗口的右下角所在的屏幕坐標。窗口定義之后,用有關窗口的輸入輸出函數(shù)就可以只在此窗口內(nèi)進行操作而不超出窗口的邊界。另外,一個屏幕可以定義多個窗口,但現(xiàn)行窗口只能有一個。,22,第3章 高級編程技術的實現(xiàn),顯示方式:文本方式窗口操作,窗口內(nèi)文本輸出函數(shù): int cprintf(char *format,表達式表); int cputs(char *str); int putch(int ch); /*這三個函數(shù)受窗口的控制,窗口內(nèi)顯示光標的位置就是它們開始輸出的位置。當輸出行超過窗口右邊界或輸出到窗口底部邊界時,會自動轉(zhuǎn)到窗口內(nèi)的下一行輸出或自動上卷窗口內(nèi)的內(nèi)容繼續(xù)輸出*/ 光標操作函數(shù): void gotoxy(int x, int y); /*把光標移到窗口(x,y)處*/,23,第3章 高級編程技術的實現(xiàn),顯示方式:文本方式屏幕操作,清屏函數(shù): void clrscr(void); /*清除窗口文本,光標移到(1,1)*/ void clreol(void); /*清除窗口從光標位置開始到本行 結(jié)尾的所有字符,但光標不變 */ void delline(void); /*刪除當前窗口的當前行*/,24,第3章 高級編程技術的實現(xiàn),顯示方式:文本方式屏幕操作,屏幕文本移動函數(shù): void movetext(int x1, int y1, int x2, int y2, int x3, int y3); 屏幕文本存取函數(shù) void gettext(int x1, int y1, int x2, int y2, void *buffer); void puttext(int x1, int y1, int x2, int y2, void *buffer);,25,第3章 高級編程技術的實現(xiàn),顯示方式:文本方式,編制一個程序,將屏幕垂直平分成兩個窗口,左邊窗口為藍色背景,白色前景,右邊窗口為綠色背景,紅色前景。兩個窗口都設計為文本輸入,即在窗口中可以輸入文字,在窗口屏幕中顯示出來。使用tab鍵在左右兩個窗口中切換,每個窗口都有光標,活動窗口光標進行閃爍。,應用實例,問題描述,26,第3章 高級編程技術的實現(xiàn),顯示方式:文本方式,首先用文本窗口函數(shù)window (int x1, int y1, int x2, int y2)畫出兩個窗口,用textcolor (int color),textbackground (int color),clrscr (void)等進行窗口屬性的設置。用tab鍵進行兩個窗口間的循環(huán)切換,在每次切換前先調(diào)用gettext (int left, int top, int right, int bottom, void * buf)函數(shù)把當前矩形窗口上的字符拷貝到由buf所指向的內(nèi)存中,在切換到另一個窗口后調(diào)用puttext (int left, int top, int right, int bottom, void * buf)把先前存儲在該窗口buf所指向的內(nèi)存中的字符拷貝到當前窗口中,并用gotoxy (int x, int y)把光標移到原先所在位置,因此可以接著先前的文本繼續(xù)編輯。,應用實例,設計思想,27,第3章 高級編程技術的實現(xiàn),顯示方式:文本方式,應用實例,程序運行截圖,28,第3章 高級編程技術的實現(xiàn),顯示方式:,圖形方式,圖形顯示方式可以滿足在屏幕上作圖的要求。在此方式下,屏幕顯示的單位是像素。屏幕顯示的像素大?。ǚ直媛剩┛梢酝ㄟ^設置不同的顯示方式來改變。像素在屏幕上的位置可由其所在的x,y坐標來決定。此時,屏幕的坐標系統(tǒng)就象一個倒置的直角坐標系。,29,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式方式設定,圖形系統(tǒng)的初始化: 用什么類型的顯卡的驅(qū)動程序 采用什么模式的圖形方式 適配器驅(qū)動程序的尋找路徑名。 注意:所用系統(tǒng)的卡一定要支持所選用的顯示模式,否則將出錯。,30,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式方式設定,圖形系統(tǒng)的初始化函數(shù): void far initgraph(int far *pdriver,int far *pmode,char far *ppath_for_driver);,31,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式方式設定,圖形系統(tǒng)的初始化函數(shù): void far initgraph(int far *pdriver,int far *pmode,char far *ppath_for_driver);,32,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式方式設定,圖形系統(tǒng)檢測函數(shù) : void far detectgraph(int far *pdriver,int far *pmode); 完成對適配器的檢查并得到顯示器類型號和相應的最高分辨率模式,將graphdriver設成DETECT, initgraph()將調(diào)用detectgraph()自動檢測所用顯卡類型,并將相應的驅(qū)動程序裝入,并將其最高的顯示模式作為當前顯示模式。 int graphdriver=DETECT,graphmode; initgraph(,33,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式方式設定,清屏函數(shù): 畫圖前一般需清除屏幕,使得屏幕如同一張白紙,以畫最新最美的圖畫。 void far cleardevice(void); 圖形系統(tǒng)的關閉: 當畫圖結(jié)束時可以通過調(diào)用關閉圖形系統(tǒng)的函數(shù): void far closegraph(void); 使顯示器恢復到調(diào)用initgraph()函數(shù)之前的文本方式。,34,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式顏色設置,前景色設置函數(shù): void far setcolor(int color); 背景色設置函數(shù): void far setbkcolor(int color);,35,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式顏色設置,前景色設置函數(shù): void far setcolor(int color); 背景色設置函數(shù): void far setbkcolor(int color);,36,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式顏色設置,CGA前景色的取值:,37,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式顏色設置,CGA背景色的取值:,38,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式顏色設置,EGA/VGA調(diào)色板:,64/256色選一,39,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式顏色設置,EGA/VGA調(diào)色板:,單色設置: void far setpalette(int index, int actual_color);,40,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式顏色設置,EGA/VGA標準色:,41,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式圖視口,設置函數(shù): void far setviewport(int xl,int y1,int x2,int y2, clipflag); 其中(x1,y1)為圖視口的左上角所在的原屏幕物理坐標,(x2,y2)為右下角所在的原屏幕物理坐標。clipflag參數(shù)clipflag若為0,則超出圖視口的圖形部分仍將顯示出來;否則,超出圖視口的部分將被切除而不顯示。 清除函數(shù): void far clearviewport(void),42,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式文本輸出,當前位置文本輸出函數(shù): void far outtext(char far *textstring); 定位文本輸出函數(shù): void far outtextxy(int x,int y,char far *textstring); 文本輸出字符串函數(shù) int sprintf(char *string, char *format, argument, );,43,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式文本輸出,文本輸出位置函數(shù): void far settextjustify(int horiz,int vert);,44,第3章 高級編程技術的實現(xiàn),顯示方式:圖形方式文本輸出,定義文本字型函數(shù): void far settextstyle(int font,int direction,int char size);,45,第3章 高級編程技術的實現(xiàn),#include main() int i,graphdriver,graphmode,size,page; char s30; graphdriver=DETECT; initgraph(,應用實例,程序源代碼,settextstyle(SMALL_FONT,HORIZ_DIR, 2); settextjustify(LEFT_TEXT,0); outtextxy(220,80,“Smallfont“); settextstyle(SANS_SERIF_FONT,HORIZ_DIR,2); settextjustify(LEFT_TEXT,0); outtextxy(220,110,“Sans serif font“); settextstyle(GOTHIC_FONT,HORIZ_DIR, 2); settextjustify(LEFT_TEXT,0); outtextxy(220,140,“gothic font“); getch(); closegraph(); ,顯示方式:圖形方式文本輸出,46,第3章 高級編程技術的實現(xiàn),應用實例,程序輸出,顯示方式:圖形方式文本輸出,47,第3章 高級編程技術的實現(xiàn),操作手段 顯示方式 圖形繪制技術 動畫技術 發(fā)聲技術 漢字顯示技術 圖像技術 精確的時間控制技術,48,第3章 高級編程技術的實現(xiàn),圖形繪制,void far moveto(int x,int y); 移動畫筆到指定的(x,y)位置,移動過程不畫。 void far moverel(int dx,int dy); 畫筆從現(xiàn)行位置(x,y)處移到一位置增量處(x+dx,y+dx),移動過程不畫: int far getx(void); 得到當前畫筆的x位置 int far gety(void); 得到當前畫筆的y位置,:畫筆定位,49,第3章 高級編程技術的實現(xiàn),圖形繪制,畫點函數(shù): void far putpixel(int x,int y,int color); 該函數(shù)表示在指定的x,y位置畫一點,點的顯示顏色由設置的color值決定。 int far getpixel(int x,int y); 該函數(shù)與putpixel()相對應,它得到在(x,y)點位置上的像素的顏色值,:點和線,50,第3章 高級編程技術的實現(xiàn),圖形繪制: 點和線,畫線函數(shù): void far line(int x0,int y0,int x1,int y1); 該函數(shù)從(x0,y0)點到(x1,y1)點畫一直線。 void far lineto(int x,int y); 該函數(shù)將從現(xiàn)行畫筆位置到(x,y)點畫一直線。 void far linerel(int dx,int dy); 該函數(shù)將從現(xiàn)行畫筆位置(x,y)到位置增量處 (x+dx,y+dy)畫一直線。,51,第3章 高級編程技術的實現(xiàn),線類型的設置: 在確省的情況下,畫線函數(shù)畫出的線都是一個像素點寬的細實線。也可以在畫線之前通過函數(shù): void far setlinestyle(int linestyle,unsigned upattern,int thickness); 定義線的類型和粗細。,setlinestyle(4,0xF3D0,1)設置的線型,圖形繪制: 點和線,52,第3章 高級編程技術的實現(xiàn),BIOS的10H中斷負責顯示器服務,該中斷的主要功能通過對AH來設置: AH=00H,功能為設置顯示方式。此時通過對AL進行設置來設定顯示方式,如設置AL=13H,則顯示方式設置為VGA的256色320200圖形顯示模式。 AH=0CH,功能為畫點。這時AL中設置的值為顏色號,CX和DX的值決定畫點的位置坐標。,圖形繪制: 點和線,利用BIOS調(diào)用,53,第3章 高級編程技術的實現(xiàn),#include #include int main() int i,j; union REGS inreg,outreg; inreg.h.ah=0; /*置屏幕顯示方式*/ inreg.h.al=0x13; /* 定義VGA256色320200圖形模式 */ int86(0x10,/*寫點*/,應用實例,在屏幕上畫出顏色不同的256條直線的程序源代碼,inreg.h.al=i; /*置顏色號*/ inreg.h.ch=0; /*決定畫點位置*/ inreg.h.cl=i; inreg.h.dh=0; inreg.h.dl=j; int86(0x10, ,圖形繪制: 點和線 利用BIOS調(diào)用,54,第3章 高級編程技術的實現(xiàn),圖形繪制,:矩形、圓和弧線,畫矩形的函數(shù): void far rectangle(int xl,int y1,int x2,int y2); 畫橢圓、圓和扇形圖函數(shù): void ellipse(int x,int y,int stangle,int endangel, int xradius,int yradius); void far circle(int x,int y,int radius); void far arc(int x,int y,int stangle,int endangle, int radius);,55,第3章 高級編程技術的實現(xiàn),編寫程序,使用鼠標進行如下操作:按住鼠標器的任意鍵并移動,十字光標將隨鼠標而移動,根據(jù)按鍵的不同采用不同的形狀來畫出相應的移動軌跡:當僅按下左鍵時用圓圈;僅按下右鍵時用矩形;其它按鍵情況用線條。,應用實例,問題描述,圖形繪制,56,第3章 高級編程技術的實現(xiàn),結(jié)合鼠標使用方法和上述的圖形繪制函數(shù)來解決問題。由于在Windows2000/XP下不支持INT 33的1號顯示鼠標光標功能,可以用畫線函數(shù)line()畫出一個十字形光標。光標的移動是通過將原位置光標用背景色再畫而使其消失,然后在新位置處重新畫一個光標,從而實現(xiàn)光標移動的動感。,應用實例,設計思想,圖形繪制,57,第3章 高級編程技術的實現(xiàn),應用實例,程序運行截圖,圖形繪制,58,第3章 高級編程技術的實現(xiàn),圖形繪制:封閉圖形的填色,填充設置函數(shù) : void far setfillstyle(int pattern,int color); 該函數(shù)將用設定的color顏色和pattern圖模式對后面畫出的輪廓圖進行填充,這些圖輪廓是由待定函數(shù)畫出的。,59,第3章 高級編程技術的實現(xiàn),圖形繪制:封閉圖形的填色,填充設置函數(shù) : void far setfillstyle(int pattern,int color),60,第3章 高級編程技術的實現(xiàn),圖形繪制:封閉圖形的填色,用戶自定義填充函數(shù): void far setfillpattern(char upattefn,int color); 該函數(shù)設置用戶自定義可填充模式,以color指出的顏色對封閉圖形進行填充。參數(shù)upattern是一個指向8個字節(jié)存儲區(qū)的指針,這8個字節(jié)表示了一個88像素點陣組成的填充圖模,它是由用戶自定義的,用來對封閉圖形填充。8個字節(jié)的圖模是這樣形成的:每個字節(jié)代表一行,而每個字節(jié)的每一個二進制位代表該行的對應列上的像素。是1,則用color顯示,是0則不顯示。,61,第3章 高級編程技術的實現(xiàn),圖形繪制:封閉圖形的填色,得到目前的填充模式和顏色的函數(shù) : void far fillsettings(struct fillsettingstype far *fillinfo); void far getfillpattern(char *upattern);,62,第3章 高級編程技術的實現(xiàn),圖形繪制:封閉圖形的填色,可填充的基本圖形函數(shù): (這些函數(shù)繪制的圖形,將根據(jù)事先用setfillstyle函數(shù)設置的填充模式和顏色,或按缺省方式進行填充 ) void bar(int x1,int y1,int x2,int y2); void far pieslice(int x,int y,int stangle,int endangle,int radius); void far bar3d(int x1,int y1,int x2,int y2,int depth,int topflag); void far sector(int x,int y,int stangle,int endang1e,int xradius,int yradius); void far fillellipse(int x,int y,int xradius,int yradius); void far fillpoly(int numpoints,int far polypoints);,63,第3章 高級編程技術的實現(xiàn),圖形繪制:封閉圖形的填色,可對任意封閉圖形填充的函數(shù) : void far floodfill(int x,int y,int border); 該函數(shù)將對任一封閉圖形進行填充,其顏色和模式將由設定的或缺省的圖模與顏色決定。其中參數(shù)(x,y)為封閉圖形中的任一點,border是封閉圖形的邊框顏色。編程時該函數(shù)位于畫封閉圖形(即要填充的圖形)的代碼之后。,64,第3章 高級編程技術的實現(xiàn),#include main() int i, graphdriver,graphmode,size,page; char s30; graphdriver=DETECT; initgraph(,應用實例,程序源代碼,settextstyle(1,0,6); /*設置字形方向,尺寸 */ outtextxy(100,60,“Welcom You“); setviewport(100,200,540,380,0); setcolor(14); setfillstyle(1,12); rectangle(20,20,420,120); settextstyle(2,0,9); floodfill(21,100,14); /*用深藍色填充*/ sprintf(s,“Lets study Turbo C”); setcolor(YELLOW); outtextxy(60,40, s);/*用黃色顯示*/ setcolor(1); settextstyle(4,0,3); outtextxy(110,80,s); getch(); closegraph(); ,圖形繪制,65,第3章 高級編程技術的實現(xiàn),應用實例,程序輸出,圖形繪制,66,第3章 高級編程技術的實現(xiàn),操作手段 顯示方式 圖形繪制技術 圖像技術 動畫技術 發(fā)聲技術 漢字顯示技術 精確的時間控制技術,67,第3章 高級編程技術的實現(xiàn),圖像技術:圖像的二種來源,(1)屏幕圖像:在圖形方式下所繪圖形形成的像素點圖像 。圖像數(shù)據(jù)直接存儲在VRAM中,VRAM中某地址單元存放的數(shù)就表示了相應屏幕上某行和列上的像素及其顏色值 。 (2)圖像文件:圖像數(shù)據(jù)以一定的格式存儲在文件中。需要有專門的軟件來支持,或自己編寫程序來讀取、顯示和生成某種格式的圖像文件。首先必須要了解某種圖像文件的格式。,68,第3章 高級編程技術的實現(xiàn),圖像技術:屏幕圖像與VRAM,直接寫屏:在圖形方式下將圖像數(shù)據(jù)直接寫入VRAM的過程,即圖像顯示過程。直接寫屏是最快的圖像顯示方法。,69,第3章 高級編程技術的實現(xiàn),圖像技術:VRAM與系統(tǒng)存儲器的對應關系,CGA的VRAM對應的內(nèi)存地址開始于B8000H,VGA、EGA的開始于A0000H。 對CGA,VRAM僅有16K字節(jié);對VGA和EGA,VRAM可達256K字節(jié),它分成獨立的4個64K字節(jié)部分,這樣的每個部分稱為一個位面或頁面(編號0-3),它們共同占有一塊內(nèi)存空間,即用同一的64K個地址。相應內(nèi)存的每個地址實際上代表VRAM4個位面上相并列的4個字節(jié)。 對于SVGA,由于它要存取更高分辨率或更多顏色的數(shù)據(jù),一般都至少擁有512K以上的VRAM,但其所占用的內(nèi)存地址仍大都是64K,因此也需要劃分許多頁面,對應到A0000H或其它的視頻內(nèi)存地址上。,70,第3章 高級編程技術的實現(xiàn),圖像技術:屏幕圖像的允許讀寫過程,允許讀的過程是:首先通過索引寄存器(接口地址為0x3ce)選擇讀位面選擇寄存器(其索引號為4),然后通過讀位面選擇寄存器(接口地址0x3cf)選擇位面號。相應的代碼為: outportb(0x3ce, 4); /*將索引號4送索引寄存器,選擇讀位面選擇寄存器* /outportb(0x3cf, n); /*將選擇的位面號n送讀位面選擇寄存器,允許該位面可讀*/,71,第3章 高級編程技術的實現(xiàn),圖像技術:屏幕圖像的讀寫過程,允許寫的過程是:首先通過索引寄存器(接口地址為0x3c4)選擇位面寫允許寄存器(索引號為2),然后通過接口地址0x3c5選擇位面號。相應的代碼為: outportb(0x3c4, 2); /*將索引號2送索引寄存器,選擇位面寫允許寄存器*/ outportb(0x3c5, k); /*送位面號至位面寫允許寄存器,允許該位面可寫*/,72,第3章 高級編程技術的實現(xiàn),圖像技術:屏幕圖像數(shù)據(jù)在VRAM中存放格式,CGA的4色320200的模式,視頻內(nèi)存起始地址B0000H。屏幕上顯示的像素點從左到右,從上到下依次存在VRAM從0號地址開始的連續(xù)地址中,每個像素占2位,VRAM每個字節(jié)存放四個像素點。 特殊的地方:屏幕上顯示的偶行像素存在16KVRAM的上半部,而奇行存在下半部。從系統(tǒng)地址看,上半部開始于B800:0000,下半部開始于B800:1000。,73,第3章 高級編程技術的實現(xiàn),圖像技術:屏幕圖像數(shù)據(jù)在VRAM中存放格式,VGA視頻內(nèi)存起始地址A0000H,在16色640480模式下采用位面對應方式,視頻內(nèi)存地址上每一個字節(jié)代表8個像素,每一位又可對應到位面中同樣位置的4位上(4位的組合表示16色之一,因此又稱位面為顏色位面)。 在屏幕上繪出一個點時,就必須將數(shù)據(jù)分別存放到四個位面中對應的位上。,74,第3章 高級編程技術的實現(xiàn),圖像技術:屏幕圖像數(shù)據(jù)在VRAM中存放格式,在256色320200模式下采用的是線性對應的方法(SVGA的所有256色和真彩都是用這種方法)。 線性對應將屏幕上每一點與視頻內(nèi)存地址按順序一一對應起來,一個點對應一個字節(jié),這樣做的好處是:這種對應方式比位面對應方式簡單多了,因為只需直接對視頻內(nèi)存地址做存取即可,而不必理會位面與內(nèi)存地址的對應關系。,75,第3章 高級編程技術的實現(xiàn),圖像技術:屏幕圖像的操作,屏幕圖像的存儲和顯示操作函數(shù),76,第3章 高級編程技術的實現(xiàn),圖像技術:圖像像素與背景像素的邏輯操作,77,第3章 高級編程技術的實現(xiàn),圖像技術:屏幕圖像操作實例,繪制滿屏的16色圓和長方形,并將屏幕圖像保存到文件pic.dat中。然后將保存在文件pic.dat的屏幕圖像重新顯示在VGA屏幕上。,應用實例,問題描述,78,第3章 高級編程技術的實現(xiàn),圖像技術:屏幕圖像操作實例,應用實例,注意事項,VGA的VRAM起始地址為A0000H,開始單元的地址為0xA000:0x0000。 存取對應屏幕圖像VRAM中的信息時,其開始地址指針定義為:ptr=(charfar*)0xa0000000L; 由于程序?qū)@示模式設置為VGAHI模式,分辨率是640480,16色,每個像素由每個位面上的1位組成,即一個字節(jié)代表8個像素,故對應的內(nèi)存地址是從A0000H開始的38400個字節(jié)地址。 由于系統(tǒng)初始化時,讀位面選擇寄存器設置為位面0,程序最后應恢復原系統(tǒng)初始化設置。,79,第3章 高級編程技術的實現(xiàn),圖像技術:屏幕圖像操作實例,應用實例,源程序,/*保存屏幕圖像*/ void save_pic(char *fname) FILE *fp; int i; long j; char far *ptr; fp=fopen(fname,“wb“); for (i=0;i4; i+) outportb(0x3ce, 4); /*選擇讀位面選擇寄存器*/ outportb(0x3cf, i); /*允許位面i可讀*/ ptr=(char far*)0xa0000000L; /*VGA的VRAM指針*/,for (j=0;j38400L;j+) fputc(*ptr, fp); ptr+; fclose(fp); outport(0x3cf,0); ,80,第3章 高級編程技術的實現(xiàn),圖像技術:屏幕圖像操作實例,應用實例,源程序,/*從文件載入圖像*/ void load_pic(char *fname) FILE *fp; int i,k=1; long j; char far *ptr; fp=fopen(fname,“rb“); for (i=0;i4; i+) outportb(0x3c4, 2); /*選擇位面寫允許寄存器*/ outportb(0x3c5, k); /*選擇位面號*/ ptr=(char far*)0xa0000000L; /*VGA的VRAM指針*/ for (j=0;j38400L;j+) /*讀滿屏信息字節(jié)數(shù)*/, *ptr=fgetc(fp); /*從文件中將圖像信息字節(jié)寫到 VRAM中*/ ptr+; /*字節(jié)地址加1*/ k=k*2; fclose(fp); getch(); outport(0x3c5,0xf); /*恢復位面允許寫寄存器的缺省值*/ ,81,第3章 高級編程技術的實現(xiàn),圖像技術:圖像文件,圖像文件由文件頭和圖像數(shù)據(jù)組成。 文件頭的內(nèi)容一般包括文件類型、文件制作者、制作時間、版本號、文件大小和壓縮方式等。 常見的圖像格式有BMP、JPEG、GIF、TIFF等。,82,第3章 高級編程技術的實現(xiàn),圖像技術: BMP圖像文件,BMP文件由4個部分組成:文件頭、信息頭、彩色表和圖像數(shù)據(jù) 文件頭包含有關于文件類型、文件大小、存放位置等信息 信息頭包含關于這幅圖像的信息,如以像素為單位的圖像的寬度和高度。 彩色表記錄圖像顏色的RGB值,83,第3章 高級編程技術的實現(xiàn),圖像技術: BMP圖像文件,圖像的每一掃描行由表示圖像像素的連續(xù)的字節(jié)組成,每一行的字節(jié)數(shù)取決于圖像的顏色數(shù)目和用像素表示的圖像寬度。 通常掃描行是由底向上存儲的,就是說,陣列中的第一個字節(jié)表示位圖左下角的像素,而最后一個字節(jié)表示位圖右上角的像素。 每一掃描行的字節(jié)數(shù)必需是4的整倍數(shù),也就是DWORD對齊的。,84,第3章 高級編程技術的實現(xiàn),圖像技術: BMP圖像文件,說明: 并不是所有的BMP文件都有彩色表。 若有彩色表,如8位256色的BMP圖像,其圖像數(shù)據(jù)的每一字節(jié)代表一個像素,但是它的值是彩色表的一個索引而不是該像素的RGB值; 若沒有彩色表,如16位高彩色或24位真彩色文件,像素值直接表示RGB值。,85,第3章 高級編程技術的實現(xiàn),圖像技術:BMP圖像文件的格式,86,第3章 高級編程技術的實現(xiàn),圖像技術:BMP圖像文件的格式,87,第3章 高級編程技術的實現(xiàn),圖像技術:BMP圖像文件的格式,88,第3章 高級編程技術的實現(xiàn),圖像技術:BMP圖像的顯示,Turbo C提供的BGI圖形接口的局限: 只支持VGA及以前的各種圖形顯示模式; 調(diào)色板顏色為標準的,難以改變; 顯示的分辨率及色彩數(shù)有限。 通過對顯卡的VRAM直接進行訪問來突破上述局限,89,第3章 高級編程技術的實現(xiàn),圖像技術:BMP圖像的顯示,目前常用的圖形顯示模式集中在256色上,主要包括 VGA320200模式 SVGA高精度的640480、800600和1024768模式。 同樣,可以利用BIOS設置高精度的SVGA圖形顯示模式。 SVGA利用VESA標準,就可以實現(xiàn)直接寫屏(WindowsXP采用了VESA標準),90,第3章 高級編程技術的實現(xiàn),圖像技術:BMP圖像的顯示,VESA圖形標準(在圖形模式下): SVGA的VRAM是順序的鏈結(jié)構,且圖像數(shù)據(jù)是按行順序存放的。一個像素用一個字節(jié)(256色)表示。 VRAM按字節(jié)連續(xù)尋址,與主機內(nèi)存采用分頁映射方式通訊,一次只能讀寫64KB的VRAM,通過改變段偏移量(I/O操作)來尋址不同的段。,91,第3章 高級編程技術的實現(xiàn),圖像技術:SVGA模式顯示BMP圖像實例,以256色640480 SVGA模式顯示BMP圖像。,應用實例,問題描述,92,第3章 高級編程技術的實現(xiàn),圖像技術:SVGA模式顯示BMP圖像實例,/*bmp文件頭結(jié)構*/ typedef struct tagBITMAPFILEHEADER int bfType; /* 通常是 BM ?,F(xiàn)在來看似乎判斷OS/2的標識已無什么意義*/ long bfSize; /* 文件大小,以字節(jié)為單位*/ int bfReserved1; /*保留,必須設置為0*/ int bfReserved2; /*保留,必須設置為0*/ long bfOffBits; /*從文件頭開始到實際的圖象數(shù)據(jù)之間的字節(jié)的偏移量。這*/ /*個參數(shù)是非常有用的,因為位圖信息頭和調(diào)色板的長度會*/ /*根據(jù)不同情況而變化,可以用這個偏移值迅速的從文件中*/ /*讀取到位數(shù)據(jù)。 */ BITMAPFILEHEADER;,應用實例,程序片段,93,第3章 高級編程技術的實現(xiàn),圖像技術:SVGA模式顯示BMP圖像實例,/*信息頭結(jié)構*/ typedef struct tagBITMAPINFOHEADER long biSize; /* 信息頭大小 */ long biWidth; /* 圖像寬度 */ long biHeight; /* 圖像高度 */ int biPlanes; /* 必須為1 */ int biBitCount; /* 每像素位數(shù),必須是1, 4, 8或24 */ long biCompression; /* 壓縮方法 */ long biSizeImage; /* 實際圖像大小,必須是4的倍數(shù) */ long biXPelsPerMeter; /* 水平方向每米像素數(shù) */ long biYPelsPerMeter; /* 垂直方向每米像素數(shù)*/ long biClrUsed; /* 所用顏色數(shù)*/ long biClrImportant; /* 重要的顏色數(shù) */ BITMAPINFOHEADER;,應用實例,程序片段,94,第3章 高級編程技術的實現(xiàn),圖像技術:SVGA模式顯示BMP圖像實例,/*調(diào)色板*/ typedef struct tagRGBQUAD char rgbBlue; /*藍色分量*/ char rgbGreen; /*綠色分量*/ char rgbRed; /*紅色分量*/ char rgbReserved; RGBQUAD;,應用實例,程序片段,95,第3章 高級編程技術的實現(xiàn),圖像技術:SVGA模式顯示BMP圖像實例,/*換頁函數(shù)*/ void selectpage(register char page) union REGS r; r.x.ax=0x4f05; r.x.bx=0; r.x.dx=page; /*選擇頁面*/ int86(0x10, ,應用實例,程序片段,96,第3章 高級編程技術的實現(xiàn),圖像技術:SVGA模式顯示BMP圖像實例,/*設置SVGA屏幕模式*/ /*101H-256色640480模式*/ /*103H-256色800600模式*/ /*105H-256色1024768模式*/ unsigned char set_SVGA_mode(int vmode) union REGS r; r.x.ax=0x4f02; r.x.bx=vmode; int86(0x10, ,應用實例,程序片段,97,第3章 高級編程技術的實現(xiàn),圖像技術:SVGA模式顯示BMP圖像實例,/*獲取當前SVGA屏幕模式*/ unsigned int get_SVGA_mode() union REGS r; r.x.ax=0x4f03; int86(0x10, ,應用實例,程序片段,98,第3章 高級編程技術的實現(xiàn),圖像技術:SVGA模式顯示BMP圖像實例,/*設置調(diào)色板*/ void set_SVGA_palette(unsigned char r, unsigned char g, unsigned char b) int k; for (k = 0; k 2); outportb(0x03C9,gk2); outportb(0x03C9,bk2); ,應用實例,程序片段,99,第3章 高級編程技術的實現(xiàn),操作手段 顯示方式 圖形繪制技術 圖像技術 動畫技術 發(fā)聲技術 漢字顯示技術 精確的時間控制技術,100,第3章 高級編程技術的實現(xiàn),動畫技術,在實際應用中,經(jīng)常會遇到要求產(chǎn)生動態(tài)畫面的情況 電影或動畫片是由一張張圖像組成的,利用人眼不能夠分辨出時間間隔在25毫秒內(nèi)的動態(tài)圖像變化這一特性,當這些連續(xù)圖像被放映時,從視覺效果上給人以動的感覺。,101,第3章 高級編程技術的實現(xiàn),動畫技術:簡單的實現(xiàn)方法,利用cleardevice()和delay()函數(shù)相互配合,先畫一幅圖形,讓它延遲一個時間,然后清屏,再畫另一幅,如此反復,形成動態(tài)效果。,102,第3章 高級編程技術的實現(xiàn),動畫技術:利用動態(tài)開辟圖視口,利用圖視口設置技術,可以實現(xiàn)圖視口動畫效果 例如可在不同圖視口中設置同樣的圖像,而讓圖視口沿x軸方向移動設置,這次出現(xiàn)前要清除上次圖視口的內(nèi)容,這樣就會出現(xiàn)圖像沿x軸移動的效果。 也就是,在位置動態(tài)變化,但大小不變的圖視口中(用setviewpot()函數(shù)),設置固定圖形(也可是微小變化的圖像),這樣雖呈現(xiàn)在觀察者面前的是當前圖視口位置在動態(tài)變化,但視覺上卻象是看到圖像在屏幕上動態(tài)變化一樣。,103,第3章 高級編程技術的實現(xiàn),動畫技術:利用動態(tài)開辟圖視口,應用實例,源程序,#include #include main() int i,graphdriver,graphmode; graphdriver=DETECT; initgraph( ,movebar(int xorig) /*設窗口并畫填色小立方體*/ setviewport(xorig,0,639,199,1); setcolor(5); bar3d(10,120,60,150,40,1); floodfill(70,130,5); floodfill(30,110,5); delay(250000); clearviewport(); ,104,第3章 高級編程技術的實現(xiàn),動畫技術:利用動態(tài)開辟圖視口,不斷的沿x軸開辟圖視窗口,就像一個大小一樣的窗口沿x軸在移動,由于總有clearviewport函數(shù)清除上次窗口的相同立方體,因而視覺效果上,就像一個立方體從左向右移動一樣。程序中定義的movebar函數(shù)作用是開辟一個圖視窗口,并畫一個填色的立方體,保留一陣(delay(250000))然后清除它,主程序不斷調(diào)用它,因每次頂點x坐標在增加,因而效果

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論