版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、系: 信息與機(jī)電工程系 專業(yè): 電子信息工程 年級: 2013級 姓名: 學(xué)號: 136710093 實(shí)驗(yàn)課程: 數(shù)字圖像處理 實(shí)驗(yàn)室號:_ 實(shí)驗(yàn)設(shè)備號: 實(shí)驗(yàn)時間: 2015.6.16 指導(dǎo)教師簽字: 成績: 實(shí)驗(yàn)四 圖像壓縮編碼實(shí)驗(yàn)?zāi)康牧私庥嘘P(guān)數(shù)字圖像壓縮的基本概念理解有損壓縮和無損壓縮的概念;理解圖像壓縮的主要原則和目的;了解幾種常用的圖像壓縮編碼方式。進(jìn)一步熟悉DCT的概念和原理;掌握對灰度和彩色圖像作離散余弦變換和反變換的方法;掌握利用MATLAB軟件進(jìn)行圖像壓縮。實(shí)驗(yàn)原理1、圖像壓縮原理圖像壓縮主要目的是為了節(jié)省存儲空間,增加傳輸速度。圖像壓縮的理想標(biāo)準(zhǔn)是信息丟失最少,壓縮比例最大
2、。不損失圖像質(zhì)量的壓縮稱為無損壓縮,無損壓縮不可能達(dá)到很高的壓縮比;損失圖像質(zhì)量的壓縮稱為有損壓縮,高的壓縮比是以犧牲圖像質(zhì)量為代價的。壓縮的實(shí)現(xiàn)方法是對圖像重新進(jìn)行編碼,希望用更少的數(shù)據(jù)表示圖像。信息的冗余量有許多種,如空間冗余,時間冗余,結(jié)構(gòu)冗余,知識冗余,視覺冗余等,數(shù)據(jù)壓縮實(shí)質(zhì)上是減少這些冗余量。高效編碼的主要方法是盡可能去除圖像中的冗余成分,從而以最小的碼元包含最大的圖像信息。編碼壓縮方法有許多種,從不同的角度出發(fā)有不同的分類方法,從信息論角度出發(fā)可分為兩大類。(1).冗余度壓縮方法,也稱無損壓縮、信息保持編碼或嫡編碼。具體說就是解碼圖像和壓縮編碼前的圖像嚴(yán)格相同,沒有失真,從數(shù)學(xué)上
3、講是一種可逆運(yùn)算。(2)信息量壓縮方法,也稱有損壓縮、失真度編碼或煙壓縮編碼。也就是說解碼圖像和原始圖像是有差別的,允許有一定的失真。應(yīng)用在多媒體中的圖像壓縮編碼方法,從壓縮編碼算法原理上可以分為以下3類:(1)無損壓縮編碼種類哈夫曼(Huffman)編碼,算術(shù)編碼,行程(RLE)編碼,Lempel zev編碼。(2)有損壓縮編碼種類預(yù)測編碼,DPCM,運(yùn)動補(bǔ)償;頻率域方法:正交變換編碼(如DCT),子帶編碼;空間域方法:統(tǒng)計分塊編碼;模型方法:分形編碼,模型基編碼;基于重要性:濾波,子采樣,比特分配,向量量化;(3)混合編碼。有JBIG,H261,JPEG,MPEG等技術(shù)標(biāo)準(zhǔn)。本實(shí)驗(yàn)主要利用
4、MATLAB程序進(jìn)行離散余弦變換(DCT)壓縮。2、離散余弦變換(DCT)圖像壓縮原理離散余弦變換DCT在圖像壓縮中具有廣泛的應(yīng)用,它是JPEG、MPEG等數(shù)據(jù)壓縮標(biāo)準(zhǔn)的重要數(shù)學(xué)基礎(chǔ)。 和相同圖像質(zhì)量的其他常用文件格式(如GIF(可交換的圖像文件格式),TIFF(標(biāo)簽圖像文件格式),PCX(圖形文件格式)相比,JPEG是目前靜態(tài)圖像中壓縮比最高的。JPEG比其他幾種壓縮比要高得多,而圖像質(zhì)量都差不多(JPEG處理的圖像只有真彩圖和灰度圖)。正是由于其高壓縮比,使得JPEG被廣泛地應(yīng)用于多媒體和網(wǎng)絡(luò)程序中。JPEG有幾種模式,其中最常用的是基于DCT變換的順序型模式,又稱為基本系統(tǒng)(Baseli
5、ne)。 用DCT壓縮圖像的過程為:(1)首先將輸入圖像分解為88或1616的塊,然后對每個子塊進(jìn)行二維DCT變換。(2)將變換后得到的量化的DCT系數(shù)進(jìn)行編碼和傳送,形成壓縮后的圖像格式。2-DCT變換公式如下:其中: f(x,y)輸入/輸出圖像取樣值(基準(zhǔn)系統(tǒng)的取值為-128,127);C(u,v)DCT系數(shù)(基準(zhǔn)系統(tǒng)中C(u,v)的取值范圍為-1023,1023);C(0,0)代表DC系數(shù),其余63個為AC系數(shù)。用DCT解壓的過程為: (1)對每個88或1616塊進(jìn)行二維DCT反變換。 (2)將反變換的矩陣的塊合成一個單一的圖像。余弦變換具有把高度相關(guān)數(shù)據(jù)能量集中的趨勢,DCT變換后矩陣
6、的能量集中在矩陣的左上角,右下的大多數(shù)的DCT系數(shù)值非常接近于0。對于通常的圖像來說,舍棄這些接近于0的DCT的系數(shù)值,并不會對重構(gòu)圖像的畫面質(zhì)量帶來顯著的下降。所以,利用DCT變換進(jìn)行圖像壓縮可以節(jié)約大量的存儲空間。壓縮應(yīng)該在最合理地近似原圖像的情況下使用最少的系數(shù)。使用系數(shù)的多少也決定了壓縮比的大小。在壓縮過程的第2步中,可以合理地舍棄一些系數(shù),從而得到壓縮的目的。在壓縮過程的第2步,還可以采用RLE和Huffman編碼來進(jìn)一步壓縮。實(shí)驗(yàn)步驟1.打開計算機(jī),啟動MATLAB程序;2.調(diào)入實(shí)驗(yàn)數(shù)字圖像,并進(jìn)行數(shù)據(jù)的DCT編碼壓縮處理;3.對圖像分別給出保留1個、2個、3個、.、20個DCT變
7、換系數(shù)的解壓縮結(jié)果,這可調(diào)整矩陣的mask中1的個數(shù)實(shí)現(xiàn),你認(rèn)為保留幾個系數(shù)時,圖像的恢復(fù)效果可以接受,通過觀察,給出結(jié)論。4.記錄和整理實(shí)驗(yàn)報告實(shí)驗(yàn)儀器1計算機(jī);2 MATLAB、Photoshop等程序;3移動式存儲器(軟盤、U盤等)。4記錄用的筆、紙。實(shí)驗(yàn)程序DCT編碼壓縮處理RGB = imread(C:UserslenovoDesktopbb.jpg); %讀取圖像I = rgb2gray(RGB); %將其轉(zhuǎn)為灰度J = dct2(I); %進(jìn)行二維離散余弦變換imshow(log(abs(J),), %顯示出變換后的圖像,此時能量集中在左上角colormap(jet(64), c
8、olorbar %建立顏色模板J(abs(J) 10) = 0; %將DCT變換結(jié)果中絕對值小于10的系數(shù)舍棄K = idct2(J); %idct2重構(gòu)圖像figure,imshow(I,0 255);figure,imshow(K,0 255)DCT變換系數(shù)的解壓縮I=imread(C:UserslenovoDesktopbb.jpg); %讀入原圖像;I = rgb2gray(I); I=im2double(I); %將原圖像轉(zhuǎn)為雙精度數(shù)據(jù)類型;T=dctmtx(8); %產(chǎn)生二維DCT變換矩陣B=blkproc(I,8 8,P1*x*P2,T,T); %計算二維DCT,矩陣T及其轉(zhuǎn)置T
9、是DCT函數(shù)P1*x*P2的參數(shù)Mask= 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; %二值掩膜,用來壓縮DCT系數(shù),只留下DCT系數(shù)中左上角的10個 B2=blkproc(B,8 8,P1.*x,Mask); %只保留DCT變換的10個系數(shù) I2=blkproc(B2,8,8,P1*x*P2,T,T); %逆DCT,重構(gòu)圖像 Subplot(1,2,1);Imshow(I);ti
10、tle(原圖像); %顯示原圖像 Subplot(1,2,2);Imshow(I2);title(壓縮圖像); %顯示壓縮后的圖像實(shí)驗(yàn)報告內(nèi)容DCT編碼壓縮處理2.DCT變換系數(shù)的解壓縮根據(jù)改變mask里面1的各數(shù)來改變圖片壓縮程度這是原有程序1的個數(shù)1少的個數(shù)1多的個數(shù)思考題簡述離散余弦變換(DCT)編碼的原理。視頻編碼和圖像編碼的對象主要是自然視頻信號、圖像信號或其預(yù)測殘差(包括幀內(nèi)和幀間)信號。號在空間域上的相關(guān)性己部分減弱,但是統(tǒng)計數(shù)據(jù)表明,在某些情況下殘差數(shù)據(jù)之間仍有其較強(qiáng)的相關(guān)性。所以類似于圖像信號和視頻信號,殘差信號也需要進(jìn)行一定的處理。這種去除相關(guān)性的處理過程就是變換編碼過程。
11、有損壓縮和無損壓縮的區(qū)別和聯(lián)系。利用有損壓縮技術(shù)可以大大地壓縮文件的數(shù)據(jù),但是會影響圖像質(zhì)量,使用了有損壓縮的圖像僅在屏幕上顯示,可能對圖像質(zhì)量影響不太大,至少對于人類眼睛的識別程度來說區(qū)別不大。如果要減少圖像占用內(nèi)存的容量,就必須使用有損壓縮方法。 無損壓縮方法的優(yōu)點(diǎn)是能夠比較好地保存圖像的質(zhì)量,但是相對來說這種方法的壓縮率比較低圖像中哪些信息是主要的,哪些信息是次要的?需要傳達(dá)給別人的部分是主要的。其他是次要的。例如肖像圖片,肖像部分是主要的,其背景是次要的。為了證明當(dāng)時的場景,場景就是主要的了,而人物就變成次要的。描述風(fēng)景,人物是次要的,背景是主要的。主要和次要是相對的。沒有絕對的主要,
12、也沒有絕對的次要。附錄資料:不需要的可以自行刪除 C語言圖形模式速成第一節(jié) 圖形模式的初始化Turbo C 提供了非常豐富的圖形函數(shù),所有圖形函數(shù)的原型均在graphics. h 中,本節(jié)主要介紹圖形模式的初始化、獨(dú)立圖形程序的建立、基本圖形功能、圖形窗口以及圖形模式下的文本輸出等函數(shù)。另外,使用圖形函數(shù)時要確保有顯示器圖形驅(qū)動程序*.BGI,同時將集成開發(fā)環(huán)境options/Linker中的Graphics lib選為on,只有這樣才能保證正確使用圖形函數(shù)。 不同的顯示器適配器有不同的圖形分辨率。即是同一顯示器適配器,在不同模式下也有不同分辨率。因此,在屏幕作圖之前,必須根據(jù)顯示器適配器種類
13、將顯示器設(shè)置成為某種圖形模式,在未設(shè)置圖形模式之前,微機(jī)系統(tǒng)默認(rèn)屏幕為文本模式(80列,25行字符模式),此時所有圖形函數(shù)均不能工作。設(shè)置屏幕為圖形模式,可用下列圖形初始化函數(shù):void far initgraph(int far *gdriver, int far *gmode,char *path);其中g(shù)driver和gmode分別表示圖形驅(qū)動器和模式,path是指圖形驅(qū)動程序所在的目錄路徑。有關(guān)圖形驅(qū)動器、圖形模式的符號常數(shù)及對應(yīng)的分辨率見graphics. h。圖形驅(qū)動程序由Turbo C出版商提供,文件擴(kuò)展名為.BGI。 根據(jù)不同的圖形適配器有不同的圖形驅(qū)動程序。例如對于EGA、
14、VGA 圖形適配器就調(diào)用驅(qū)動程序EGAVGA.BGI。#include stdio.h#include graphics.hint main()int gdriver, gmode;gdriver=VGA;gmode=VGAHI;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(100, 100, 300, 250, 50, 1); /*畫一長方體*/getch();closegraph();return 0;有時編程者并不知道所用的圖形顯示器適配器種類,或者需要將編寫的程序用于不同圖形驅(qū)動器,Turbo C 提供了一個自動檢測顯示器硬件的函數(shù),其調(diào)用
15、格式為:void far detectgraph(int *gdriver, *gmode);其中g(shù)driver和gmode的意義與上面相同。 自動進(jìn)行硬件測試后進(jìn)行圖形初始化:#include stdio.h#include graphics.hint main()int gdriver, gmode;detectgraph(&gdriver, &gmode); /*自動測試硬件*/printf(the graphics driver is %d, mode is %dn,gdriver,gmode); /*輸出測試結(jié)果*/getch();initgraph(&gdriver, &gmode
16、, C:TC2.0BGI);/* 根據(jù)測試結(jié)果初始化圖形*/bar3d(100, 100, 300, 250, 50, 1); /*畫一長方體*/getch();closegraph();return 0;上例程序中先對圖形顯示器自動檢測,然后再用圖形初始化函數(shù)進(jìn)行初始化設(shè)置,但Turbo C提供了一種更簡單的方法, 即用gdriver=DETECT 語句后再跟initgraph()函數(shù)就行了。采用這種方法后,上例可改為:#include stdio.h#include graphics.hint main()int gdriver=DETECT, gmode;initgraph(&gdriv
17、er, &gmode, C:TC2.0BGI);bar3d(50, 50, 150, 30, 50, 1);getch();closegraph();return 0;另外,Turbo C 提供了退出圖形狀態(tài)的函數(shù)closegraph(),其調(diào)用格式為:void far closegraph(void);第二節(jié) 屏幕顏色的設(shè)置和清屏函數(shù)對于圖形模式的屏幕顏色設(shè)置,同樣分為背景色的設(shè)置和前景色的設(shè)置。在Turbo C中分別用下面兩個函數(shù): 設(shè)置背景色: void far setbkcolor(int color);設(shè)置作圖色: void far setcolor(int color);其中col
18、or 為圖形方式下顏色的規(guī)定數(shù)值,對EGA,VGA顯示器適配器,有關(guān)顏色的符號常數(shù)及數(shù)值見graphics.h。清除圖形屏幕內(nèi)容但不清除圖形背景使用清屏函數(shù),其調(diào)用格式如下: voide far cleardevice(void);#include stdio.h#include graphics.hint main()int gdriver, gmode, i,aa;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI); /*圖形初始化*/setbkcolor(0); /*設(shè)置圖形背景*/cleardevice();for(i=0; i
19、=15; i+)setcolor(i); /*設(shè)置不同作圖色*/circle(320, 240, 20+i*10); /*畫半徑不同的圓*/getch();for(i=0; i=15; i+)setbkcolor(i); /*設(shè)置不同背景色*/cleardevice();circle(320, 240, 20+i*10);getch();aa=getmaxcolor();printf(maxcolor=%d,aa);getch();closegraph();return 0;另外,TURBO C也提供了幾個獲得現(xiàn)行顏色設(shè)置情況的函數(shù)。 int far getbkcolor(void); 返回現(xiàn)
20、行背景顏色值。int far getcolor(void); 返回現(xiàn)行作圖顏色值。int far getmaxcolor(void); 返回最高可用的顏色值。第三節(jié) 基本畫圖函數(shù)基本圖形函數(shù)包括畫點(diǎn),線以及其它一些基本圖形的函數(shù)。本節(jié)對這些函數(shù)作一全面的介紹。 、畫點(diǎn). 畫點(diǎn)函數(shù) void far putpixel(int x, int y, int color); 該函數(shù)表示有指定的象元畫一個按color 所確定顏色的點(diǎn)。對于顏色color的值可從表3中獲得而對x, y是指圖形象元的坐標(biāo)。在圖形模式下,是按象元來定義坐標(biāo)的。對VGA適配器,它的最高分辨率為640 x480,其中640為整個屏
21、幕從左到右所有象元的個數(shù),480為整個屏幕從上到下所有象元的個數(shù)。屏幕的左上角坐標(biāo)為(0,0),右下角坐標(biāo)為(639, 479),水平方向從左到右為x 軸正向,垂直方向從上到下為y軸正向。TURBO C的圖形函數(shù)都是相對于圖形屏幕坐標(biāo),即象元來說的。關(guān)于點(diǎn)的另外一個函數(shù)是: int far getpixel(int x, int y); 它獲得當(dāng)前點(diǎn)(x, y)的顏色值。 II、有關(guān)坐標(biāo)位置的函數(shù) int far getmaxx(void);返回x軸的最大值。int far getmaxy(void);返回y軸的最大值。int far getx(void); 返回游標(biāo)在x軸的位置。void f
22、ar gety(void); 返回游標(biāo)有y軸的位置。void far moveto(int x, int y); 移動游標(biāo)到(x, y)點(diǎn),不是畫點(diǎn),在移動過程中亦畫點(diǎn)。void far moverel(int dx, int dy); 移動游標(biāo)從現(xiàn)行位置(x, y)移動到(x+dx, y+dy)的位置,移動過程中不畫點(diǎn)。、畫線I. 畫線函數(shù)TURBO C提供了一系列畫線函數(shù): void far line(int x0, int y0, int x1, int y1); 畫一條從點(diǎn)(x0, y0)到(x1, y1)的直線。void far lineto(int x, int y); 畫一作從現(xiàn)
23、行游標(biāo)到點(diǎn)(x, y)的直線。void far linerel(int dx, int dy); 畫一條從現(xiàn)行游標(biāo)(x,y)到按相對增量確定的點(diǎn)(x+dx, y+dy)的直線。void far circle(int x, int y, int radius); 以(x, y)為圓心,radius為半徑,畫一個圓。void far arc(int x, int y, int stangle, int endangle,int radius); 以(x,y)為圓心,radius為半徑,從stangle開始到endangle結(jié)束(用度表示)畫一段圓弧線。在TURBO C中規(guī)定x軸正向?yàn)? 度,逆時針
24、方向旋轉(zhuǎn)一周, 依次為90,180, 270和360度(其它有關(guān)函數(shù)也按此規(guī)定,不再重述)。 void ellipse(int x, int y, int stangle, int endangle,int xradius,int yradius);以(x, y)為中心,xradius,yradius為x軸和y軸半徑,從角stangle 開始到endangle結(jié)束畫一段橢圓線,當(dāng)stangle=0,endangle=360時, 畫出一個完整的橢圓。void far rectangle(int x1, int y1, int x2, inty2); 以(x1, y1)為左上角,(x2, y2)為
25、右下角畫一個矩形框。 void far drawpoly(int numpoints, int far *polypoints); 畫一個頂點(diǎn)數(shù)為numpoints,各頂點(diǎn)坐標(biāo)由polypoints給出的多邊形。polypoints整型數(shù)組必須至少有2 倍頂點(diǎn)數(shù)個無素。每一個頂點(diǎn)的坐標(biāo)都定義為x,y,并且x在前。值得注意的是當(dāng)畫一個封閉的多邊形時,numpoints 的值取實(shí)際多邊形的頂點(diǎn)數(shù)加一,并且數(shù)組polypoints中第一個和最后一個點(diǎn)的坐標(biāo)相同。下面舉一個用drawpoly()函數(shù)畫箭頭的例子。#include stdio.h#include graphics.hint main()
26、int gdriver, gmode, i;int arw16=200,102,300,102,300,107,330,100,300,93,300,98,200,98,200,102;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(12); /*設(shè)置作圖顏色*/drawpoly(8, arw); /*畫一箭頭*/getch();closegraph();return 0;II、設(shè)定線型函數(shù)在沒有對線的特性進(jìn)行設(shè)定之前,TURBO C 用其默認(rèn)值,即一點(diǎn)
27、寬的實(shí)線,但TURBO C 也提供了可以改變線型的函數(shù)。線型包括:寬度和形狀。其中寬度只有兩種選擇:一點(diǎn)寬和三點(diǎn)寬。而線的形狀則有五種。下面介紹有關(guān)線型的設(shè)置函數(shù)。void far setlinestyle(int linestyle,unsigned upattern,int thickness);該函數(shù)用來設(shè)置線的有關(guān)信息,其中l(wèi)inestyle是線形狀的規(guī)定,見graphics.h。對于upattern,只有l(wèi)inestyle選USERBIT_LINE 時才有意義 (選其它線型,uppattern取0即可)。此時uppattern的16位二進(jìn)制數(shù)的每一位代表一個象元,如果那位為1,則該象
28、元打開,否則該象元關(guān)閉。 void far getlinesettings(struct linesettingstypefar *lineinfo);該函數(shù)將有關(guān)線的信息存放到由lineinfo 指向的結(jié)構(gòu)中,表中l(wèi)inesettingstype的結(jié)構(gòu)如下:struct linesettingstypeint linestyle;unsigned upattern;int thickness;例如下面兩句程序可以讀出當(dāng)前線的特性 struct linesettingstype *info;getlinesettings(info);void far setwritemode(int mode
29、);該函數(shù)規(guī)定畫線的方式。如果mode=0,則表示畫線時將所畫位置的原來信息覆蓋了(這是TURBO C的默認(rèn)方式)。如果mode=1, 則表示畫線時用現(xiàn)在特性的線與所畫之處原有的線進(jìn)行異或(XOR)操作,實(shí)際上畫出的線是原有線與現(xiàn)在規(guī)定的線進(jìn)行異或后的結(jié)果。因此,當(dāng)線的特性不變,進(jìn)行兩次畫線操作相當(dāng)于沒有畫線。有關(guān)線型設(shè)定和畫線函數(shù)的例子如下所示。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);set
30、bkcolor(BLUE);cleardevice();setcolor(GREEN);circle(320, 240, 98);setlinestyle(0, 0, 3); /*設(shè)置三點(diǎn)寬實(shí)線*/setcolor(2);rectangle(220, 140, 420, 340);setcolor(WHITE);setlinestyle(4, 0 xaaaa, 1);/*設(shè)置一點(diǎn)寬用戶定義線*/line(220, 240, 420, 240);line(320, 140, 320, 340);getch();closegraph();return 0;第四節(jié) 基本圖形的填充填充就是用規(guī)定的顏色
31、和圖模填滿一個封閉圖形。 一般是先畫輪廓再填充。TURBO C提供了一些先畫出基本圖形輪廓, 再按規(guī)定圖模和顏色填充整個封閉圖形的函數(shù)。在沒有改變填充方式時,TURBO C 以默認(rèn)方式填充。 void far bar(int x1, int y1, int x2, int y2);確定一個以(x1,y1)為左上角,(x2,y2)為右下角的矩形窗口,再按規(guī)定圖模和顏色填充。說明:此函數(shù)不畫出邊框,所以填充色為邊框。void far bar3d(int x1, int y1, int x2, int y2,int depth,int topflag);當(dāng)topflag為非0時, 畫出一個三維的長方
32、體。當(dāng)topflag為0時,三維圖形不封頂,實(shí)際上很少這樣使用。說明: bar3d()函數(shù)中,長方體第三維的方向不隨任何參數(shù)而變,即始終為45度的方向。void far pieslice(int x,int y,int stangle,int endangle,int radius);畫一個以(x, y)為圓心,radius為半徑,stangle為起始角度,endangle 為終止角度的扇形,再按規(guī)定方式填充。當(dāng)stangle=0,endangle=360 時變成一個實(shí)心圓,并在圓內(nèi)從圓點(diǎn)沿X軸正向畫一條半徑。void far sector(int x, int y,int stanle,in
33、tendangle,int xradius, int yradius);畫一個以(x, y)為圓心分別以xradius, yradius為x軸和y軸半徑,stangle 為起始角,endangle為終止角的橢圓扇形,再按規(guī)定方式填充。第五節(jié) 設(shè)定填充方式TURBO C有四個與填充方式有關(guān)的函數(shù)。下面分別介紹: void far setfillstyle(int pattern, int color); color的值是當(dāng)前屏幕圖形模式時顏色的有效值。pattern的值及與其等價的符號常數(shù)見graphics.h。除USER_FILL(用戶定義填充式樣)以外,其它填充式樣均可由setfillsty
34、le() 函數(shù)設(shè)置。當(dāng)選用USER_FILL時,該函數(shù)對填充圖模和顏色不作任何改變。 之所以定義USER_FILL主要因?yàn)樵讷@得有關(guān)填充信息時用到此項(xiàng)。void far setfillpattern(char * upattern,int color); 設(shè)置用戶定義的填充圖模的顏色以供對封閉圖形填充。其中upattern是一個指向8個字節(jié)的指針。這8個字節(jié)定義了8x8點(diǎn)陣的圖形。每個字節(jié)的8位二進(jìn)制數(shù)表示水平8點(diǎn),8個字節(jié)表示8行,然后以此為模型向個封閉區(qū)域填充。void far getfillpattern(char * upattern); 該函數(shù)將用戶定義的填充圖模存入upattern
35、指針指向的內(nèi)存區(qū)域。void far getfillsetings(struct fillsettingstypefar * fillinfo); 獲得現(xiàn)行圖模的顏色并將存入結(jié)構(gòu)指針變量fillinfo中。其中fillsettingstype結(jié)構(gòu)定義如下:struct fillsettingstypeint pattern; /* 現(xiàn)行填充模式 * /int color; /* 現(xiàn)行填充模式 * /; 有關(guān)圖形填充圖模的顏色的選擇,請看下面例程。#include stdio.h#include graphics.hmain()char str8=10,20,30,40,50,60,70,80;
36、 /*用戶定義圖模*/int gdriver,gmode,i;struct fillsettingstype save;/*定義一個用來存儲填充信息的結(jié)構(gòu)變量*/gdriver=DETECT;initgraph(&gdriver,&gmode,C:TC2.0BGI);setbkcolor(BLUE);cleardevice();for(i=0;i13;i+)setcolor(i+3);setfillstyle(i,2+i); /* 設(shè)置填充類型 */bar(100,150,200,50); /*畫矩形并填充*/bar3d(300,100,500,200,70,1); /* 畫長方體并填充*/p
37、ieslice(200, 300, 90, 180, 90);/*畫扇形并填充*/sector(500,300,180,270,200,100);/*畫橢圓扇形并填充*/getch();cleardevice();setcolor(14);setfillpattern(str, RED);bar(100,150,200,50);bar3d(300,100,500,200,70,0);pieslice(200,300,0,360,90);sector(500,300,0,360,100,50);getch();getfillsettings(&save);/*獲得用戶定義的填充模式信息*/clo
38、segraph();clrscr();printf(The pattern is %d, The color of filling is %d,save.pattern, save.color);/*輸出目前填充圖模和顏色值*/getch();第六節(jié) 任意封閉圖形的填充截止目前為止,我們只能對一些特定形狀的封閉圖形進(jìn)行填充,但還不能對任意封閉圖形進(jìn)行填充。為此,TURBO C 提供了一個可對任意封閉圖形填充的函數(shù),其調(diào)用格式如下: void far floodfill(int x, int y, int border); 其中:x, y為封閉圖形內(nèi)的任意一點(diǎn),border為邊界的顏色,也就是封
39、閉圖形輪廓的顏色。調(diào)用了該函數(shù)后,將用由函數(shù)setfillstyle()規(guī)定的顏色和模式填滿整個封閉圖形。注意:a. 如果x或y取在邊界上,則不進(jìn)行填充。b. 如果不是封閉圖形則填充會從沒有封閉的地方溢出去,填滿其它地方。c. 如果x或y在圖形外面,則填充封閉圖形外的屏幕區(qū)域。d. 由border指定的顏色值必須與圖形輪廓的顏色值相同, 但填充色可選任意顏色。下例是有關(guān)floodfill()函數(shù)的用法,該程序填充了bar3d()所畫長方體中其它兩個未填充的面。#include stdio.h#include graphics.hmain()int gdriver, gmode;struct f
40、illsettingstype save;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(LIGHTRED);setlinestyle(0,0,3);setfillstyle(1,14); /*設(shè)置填充方式*/bar3d(100,200,400,350,200,1); /*畫長方體并填充*/floodfill(450,300,LIGHTRED);/*填充長方體另外兩個面*/floodfill(250,150, LIGHTRED);rectangle(45
41、0,400,500,450); /*畫一矩形*/floodfill(470,420, LIGHTRED); /*填充矩形*/getch();closegraph();第七節(jié)屏幕操作函數(shù)除了清屏函數(shù)以外,關(guān)于屏幕操作還有以下函數(shù): void far setactivepage(int pagenum); void far setvisualpage(int pagenum);這兩個函數(shù)只用于EGA,VGA 以及HERCULES圖形適配器。setctivepage()函數(shù)是為圖形輸出選擇激活頁。所謂激活頁是指后續(xù)圖形的輸出被寫到函數(shù)選定的pagenum頁面,該頁面并不一定可見。setvisualp
42、age()函數(shù)才使pagenum所指定的頁面變成可見頁。頁面從0開始(Turbo C默認(rèn)頁)。如果先用setactivepage() 函數(shù)在不同頁面上畫出一幅幅圖像,再用setvisualpage() 函數(shù)交替顯示,就可以實(shí)現(xiàn)一些動畫的效果。void far getimage(int xl,int yl, int x2,int y2,void far *mapbuf); void far putimge(int x,int,y,void * mapbuf, int op); unsined far imagesize(int xl,int yl,int x2,int y2);這三個函數(shù)用于將屏
43、幕上的圖像復(fù)制到內(nèi)存,然后再將內(nèi)存中的圖像送回到屏幕上。首先通過函數(shù)imagesize() 測試要保存左上角為(xl,yl),右上角為(x2,y2)的圖形屏幕區(qū)域內(nèi)的全部內(nèi)容需多少個字節(jié),然后再給mapbuf分配一個所測數(shù)字節(jié)內(nèi)存空間的指針。通過調(diào)用getimage()函數(shù)就可將該區(qū)域內(nèi)的圖像保存在內(nèi)存中,需要時可用putimage()函數(shù)將該圖像輸出到左上角為點(diǎn)(x, y)的位置上,其中g(shù)etimage()函數(shù)中的參數(shù)op規(guī)定如何釋放內(nèi)存中圖像。 關(guān)于這個參數(shù)的定義參見下表。對于imagesize()函數(shù),只能返回字節(jié)數(shù)小于64K字節(jié)的圖像區(qū)域,否則將會出錯,出錯時返回-1。本節(jié)介紹的函數(shù)在
44、圖像動畫處理、菜單設(shè)計技巧中非常有用。下面程序模擬兩個小球動態(tài)碰撞過程。#include stdio.h#include graphics.h#include malloc.hint main()int i, gdriver, gmode, size;void *buf;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(LIGHTRED);setlinestyle(0,0,1);setfillstyle(1, 10);circle(100, 200, 30
45、);floodfill(100, 200, 12);size=imagesize(69, 169, 131, 231);buf=malloc(size);if(!buf) return -1;getimage(69, 169, 131, 231,buf);putimage(500, 269, buf, COPY_PUT);for(i=0; i185; i+)putimage(70+i, 170, buf, COPY_PUT);putimage(500-i, 170, buf, COPY_PUT);for(i=0;i185; i+)putimage(255-i, 170, buf, COPY_P
46、UT);putimage(315+i, 170, buf, COPY_PUT);getch();closegraph();第八節(jié)用戶對文本字符大小的設(shè)置前面介紹的settextstyle()函數(shù),可以設(shè)定圖形方式下輸出文本字符這字體和大小但對于筆劃型字體(除8*8點(diǎn)陣字以個的字體),只能在水平和垂直方向以相同的放大倍數(shù)放大。 為此Turbo C2.0又提供了另外一個setusercharsize() 函數(shù),對筆劃字體可以分別設(shè)置水平和垂直方向的放大倍數(shù)。該函數(shù)的調(diào)用格式為: void far setusercharsize(int mulx, intdivx, int muly, int di
47、vy); 該函數(shù)用來設(shè)置筆劃型字和放大系數(shù),它只有在settextstyle()函數(shù)中的charsize為0(或USER_CHAR_SIZE)時才起作用,并且字體為函數(shù)settextstyle()規(guī)定的字體。 調(diào)用函數(shù)setusercharsize()后,每個顯示在屏幕上的字符都以其缺省大小乘以mulx/divx為輸出字符寬,乘以muly/divy為輸出字符高。 #include stdio.h#include graphics.hint main()int gdriver, gmode;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI
48、);setbkcolor(BLUE);cleardevice();setfillstyle(1, 2); /*設(shè)置填充方式*/setcolor(WHITE); /*設(shè)置白色作圖*/rectangle(100, 100, 330, 380);floodfill(50, 50, 14); /*填充方框以外的區(qū)域*/setcolor(12); /*作圖色為淡紅*/settextstyle(1, 0, 8); /*三重筆劃字體,放大8倍*/outtextxy(120, 120, Very Good);setusercharsize(2, 1, 4, 1);/*水平放大2倍,垂直放大4倍*/setcol
49、or(15);settextstyle(3, 0, 5);/*無襯字筆劃,放大5倍*/outtextxy(220, 220, Very Good);setusercharsize(4, 1, 1, 1);settextstyle(3, 0, 0);outtextxy(180, 320, Good);getch();closegraph();return 0;第九節(jié)文本字體、字型和輸出方式的設(shè)置有關(guān)圖形方式下的文本輸出函數(shù),可以通過setcolor()函數(shù)設(shè)置輸出文本的顏色。另外,也可以改變文本字體大小以及選擇是水平方向輸出還是垂直方向輸出。 void far settexjustify(int
50、 horiz, int vert); 該函數(shù)用于定位輸出字符串。對使用outtextxy(int x, int y, char far *str textstring)函數(shù)所輸出的字符串,其中哪個點(diǎn)對應(yīng)于定位坐標(biāo)(x,y)在TurboC2.0中是有規(guī)定的。如果把一個字符串看成一個長方形的圖形,在水平方向顯示時,字符串長方形按垂直方向可分為頂部,中部和底部三個位置,水平方向可分為左,中,右三個位置,兩者結(jié)合就有9個位置。settextjustify()函數(shù)的第一個參數(shù)horiz 指出水平方向三個位置中的一個,第二個參數(shù)vert指出垂直方向三個位置中的一個,二者就確定了其中一個位置。當(dāng)規(guī)定了這個位
51、置后,用outtextxy() 函數(shù)輸出字符串時, 字符串長方形的這個規(guī)定位置就對準(zhǔn)函數(shù)中的(x,y)位置。而對用uttext()函數(shù)輸出字符串時,這個規(guī)定的位置就位于現(xiàn)行游標(biāo)的位置。 有關(guān)參數(shù)horiz和vert的取值參見graphics.h。void far settextstyle(int font, int direction,int charsize); 該函數(shù)用來設(shè)置輸出字符的字形(由font確定)、輸出方向(由direction確定)和字符大小(由charsize確定)等特性。 Turbo C2.0對函數(shù)中各個參數(shù)的規(guī)定見graphics.h。有關(guān)圖形屏幕下文本輸出和字體字型設(shè)置
52、函數(shù)的用法請看下例: #include stdio.h#include graphics.hint main()int i, gdriver, gmode;char s30;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setviewport(100, 100, 540, 380, 1);/*定義一個圖形窗口*/setfillstyle(1, 2); /*綠色以實(shí)填充*/setcolor(YELLOW);rectangle(0, 0, 439, 279);floodfi
53、ll(50, 50, 14);setcolor(12);settextstyle(1, 0, 8);/*三重筆劃字體, 水平放大8倍*/outtextxy(20, 20, Good Better);setcolor(15);settextstyle(3, 0, 5);/*無襯筆劃字體, 水平放大5倍*/outtextxy(120, 120, Good Better);setcolor(14);settextstyle(2, 0, 8);i=620;sprintf(s, Your score is %d, i);/*將數(shù)字轉(zhuǎn)化為字符串*/outtextxy(30, 200, s);/*指定位置輸出字符串*/
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024藝術(shù)品拍賣與宣傳推廣綜合服務(wù)合同3篇
- 2025年度環(huán)保設(shè)施PPP項(xiàng)目合作合同范本3篇
- 2025年度智能車庫產(chǎn)權(quán)交易合同范本4篇
- 2025年度文化產(chǎn)業(yè)園開發(fā)與租賃合同3篇
- 2025年企事業(yè)單位食堂承包與托管全面合作協(xié)議12篇
- 2025年度廠長任期項(xiàng)目投資與風(fēng)險管理合同3篇
- 2025年中投中財基金管理有限公司招聘筆試參考題庫含答案解析
- 2025年中化集團(tuán)中化能源物流公司招聘筆試參考題庫含答案解析
- 二零二五版美容院專業(yè)護(hù)膚技術(shù)研發(fā)與轉(zhuǎn)讓合同4篇
- 二零二五版門窗安裝工程環(huán)保驗(yàn)收合同2篇
- MT/T 199-1996煤礦用液壓鉆車通用技術(shù)條件
- GB/T 6144-1985合成切削液
- GB/T 10357.1-2013家具力學(xué)性能試驗(yàn)第1部分:桌類強(qiáng)度和耐久性
- 第三方在線糾紛解決機(jī)制(ODR)述評,國際商法論文
- 第5章-群體-團(tuán)隊溝通-管理溝通
- 腎臟病飲食依從行為量表(RABQ)附有答案
- 深基坑-安全教育課件
- 園林施工管理大型園林集團(tuán)南部區(qū)域養(yǎng)護(hù)標(biāo)準(zhǔn)圖例
- 排水許可申請表
- 低血糖的觀察和護(hù)理課件
- 計量檢定校準(zhǔn)技術(shù)服務(wù)合同協(xié)議書
評論
0/150
提交評論