實驗一位圖文件的讀取與顯示_第1頁
實驗一位圖文件的讀取與顯示_第2頁
實驗一位圖文件的讀取與顯示_第3頁
實驗一位圖文件的讀取與顯示_第4頁
實驗一位圖文件的讀取與顯示_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗一 位圖文件的讀取與顯示【開發(fā)語言及實現(xiàn)平臺或?qū)嶒灜h(huán)境】(1)開發(fā)語言: C+(2)實現(xiàn)平臺:Microsoft Visual Studio 6.0【實驗?zāi)康摹浚?)掌握位圖的文件結(jié)構(gòu)(2)掌握VC+6.0環(huán)境下讀取位圖方式(3)能夠?qū)ξ粓D進行顯示【實驗要求】(1)在VC+6.0環(huán)境下編程實現(xiàn)對位圖的讀取和顯示操作 (2)能夠?qū)ξ粓D的結(jié)構(gòu)進行分析說明(3)熟悉位圖讀取過程中BITMAP結(jié)構(gòu)體的使用【實驗原理】在計算機位圖文件由三部分組成,分別是:文件頭、位圖信息和位圖像素數(shù)據(jù)。1 位圖文件頭 位圖文件頭主要用于識別位圖文件。以下是位圖文件頭結(jié)構(gòu)的定義: typedef struct tag

2、BITMAPFILEHEADER WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER;其中的bfType值應(yīng)該是“BM”(0x4d42),標志該文件是位圖文件。bfSize的值是位圖文件的大小。2. 位圖信息結(jié)構(gòu)位圖信息結(jié)構(gòu)中所記錄的值用于分配內(nèi)存,設(shè)置調(diào)色板信息,讀取像素值等。以下是位圖信息結(jié)構(gòu)的定義: typedef struct tagBITMAPINFO BITMAPINFOHEADER bmiHeader; /信息頭RGBQUAD bmiCol

3、ors1; /顏色表 BITMAPINFO;可見位圖信息也是由兩部分組成的:位圖信息頭 + 顏色表2.1 位圖信息頭 位圖信息頭包含了單個像素所用字節(jié)數(shù)以及描述顏色的格式,此外還包括位圖的寬度、高度、目標設(shè)備的位平面數(shù)、圖像的壓縮格式。以下是位圖信息頭結(jié)構(gòu)的定義: typedef struct tagBITMAPINFOHEADER DWORD biSize; /結(jié)構(gòu)BITMAPINFOHEADER的字節(jié)數(shù),即/sizeof(BITMAPINFOHEADER*LONG biWidth; /以像素為單位的圖像寬度*LONG biHeight; /以像素為單位的圖像長度WORD biPlanes;

4、 /目標設(shè)備的位平面數(shù)WORD biBitCount /每個像素的位數(shù)*(1)DWORD biCompression; /圖像的壓縮格式(這個值幾乎總是為0)DWORD biSizeImage; /以字節(jié)為單位的圖像數(shù)據(jù)的大?。▽?BI_RGB壓縮方式而言)LONG biXPelsPerMeter; /水平方向上的每米的像素個數(shù)LONG biYPelsPerMeter; /垂直方向上的每米的像素個數(shù)DWORD biClrUsed; /調(diào)色板中實際使用的顏色數(shù)(2)DWORD biClrImportant; /現(xiàn)實位圖時必須的顏色數(shù)(3) BITMAPINFOHEADER; 說明:*是需要加以注

5、意的部分,因為它們是我們在進行位圖操作時經(jīng)常參考的變量(1)對于每個像素的字節(jié)數(shù),分別有一下意義:0,用在JPEG格式中1,單色圖,調(diào)色板中含有兩種顏色,也就是我們通常說的黑白圖片4,16色圖8,256色圖,通常說的灰度圖16,64K圖,一般沒有調(diào)色板,圖像數(shù)據(jù)中每兩個字節(jié)表示一個像素,5個或6個位表示一個RGB分量24,16M真彩色圖,一般沒有調(diào)色板,圖像數(shù)據(jù)中每3個字節(jié)表示一個像素,每個字節(jié)表示一個RGB分量32,4G真彩色,一般沒有調(diào)色板,每4個字節(jié)表示一個像素,相對24位真彩圖而言,加入了一個透明度,即RGBA模式(2)這個值通常為0,表示使用biBitCount確定的全部顏色,例外是

6、使用的顏色樹木小于制定的顏色深度的顏色數(shù)目的最大值。(3)這個值通常為0,表示所有的顏色都是必需的。2.2 顏色表 顏色表一般是針對16位一下的圖像而設(shè)置的,對于16位和16位以上的圖像,由于其位圖像素數(shù)據(jù)中直接對對應(yīng)像素的RGB(A顏色進行描述,因而省卻了調(diào)色板。而對于16位一下的圖像,由于其位圖像素數(shù)據(jù)中記錄的只是調(diào)色板索引值,因而需要根據(jù)這個索引到調(diào)色板去取得相應(yīng)的RGB(A顏色。顏色表的作用就是創(chuàng)建調(diào)色板。下圖是帶調(diào)色板和不帶調(diào)色板的位圖的簡單示意圖:a. 帶調(diào)色板的位圖 b. 不帶調(diào)色板的位圖圖1.1 不同的位圖結(jié)構(gòu)顏色表是由顏色表項組成的,顏色表項結(jié)構(gòu)的定義如下:typedef s

7、truct tagRGBQUAD BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; RGBQUAD;其中需要注意的問題是,RGBQUAD結(jié)構(gòu)中的顏色順序是BGR,而不是平常的RGB。 3位圖數(shù)據(jù) 最后,在位圖文件頭、位圖信息頭、位圖顏色表之后,便是位圖的主體部分:位圖數(shù)據(jù)。根據(jù)不同的位圖,位圖數(shù)據(jù)所占據(jù)的字節(jié)數(shù)也是不同的,比如,對于8位位圖,每個字節(jié)代表了一個像素,對于16位位圖,每兩個字節(jié)代表了一個像素,對于24位位圖,每三個字節(jié)代表了一個像素,對于32位位圖,每四個字節(jié)代表了一個像素。 【實驗步驟】(1)在VC+6.0環(huán)

8、境下創(chuàng)建名為DibProcess的MFC應(yīng)用程序工程(多文檔)(2)在類CDibProcessDoc中編寫讀取位圖文件的代碼,步驟如下:添加存取bmp文件信息的相關(guān)成員變量:(都為公有成員變量)LPBITMAPINFO lpbminfo; / 指向BITMAPINFO結(jié)構(gòu)的指針LPBITMAPINFOHEADER lpbmihrd; /指向BITMAPINFOHEADER結(jié)構(gòu)的指針BITMAPFILEHEADER bmfHeader; /BITMAPFILEHEADER結(jié)構(gòu)LPSTR lpdib; /指向DIB的指針LPSTR lpDIBBits; / DIB像素指針DWORD dwDIBSi

9、ze; /DIB大小HGLOBAL m_hDib;/DIB對象的句柄RGBQUAD* lpRgbQuag;/指向顏色表的指針CSize m_sizeDoc;添加讀取和顯示bmp文件的相關(guān)成員函數(shù)如下:(都為公有成員函數(shù))WORD CDibProcessDoc:GetColorNum(LPSTR lpdib /返回DIB位圖的顏色數(shù)目long dwClrUsed = (LPBITMAPINFOHEADERlpdib->biClrUsed; / 讀取dwClrUsed值 if (dwClrUsed != 0 return (WORDdwClrUsed;/ 如果dwClrUsed不為0,直接返

10、回該值 WORD wBitCount = (LPBITMAPINFOHEADERlpdib->biBitCount;/ 讀取biBitCount值 switch (wBitCount/ 按照像素的位數(shù)計算顏色數(shù)目case 1:return 2;case 4:return 16;case 8:return 256;default:return 0;CPalette* CDibProcessDoc:GetDocPal( const /返回調(diào)色板的指針return m_palDIB;DWORD CDibProcessDoc:GetHeight(LPSTR lpdibreturn (LPBITM

11、APINFOHEADERlpdib->biHeight;/返回DIB高度DWORD CDibProcessDoc:GetWidth(LPSTR lpdibreturn (LPBITMAPINFOHEADERlpdib->biWidth;/返回DIB寬度HGLOBAL CDibProcessDoc:GetHObject( constreturn m_hDib; /返回DIB句柄LPSTR CDibProcessDoc:GetBits(LPSTR lpdib /返回DIB圖像像素的起始 /置return (lpdib + (LPBITMAPINFOHEADERlpdib->biS

12、ize+GetPalSize(lpdib;BOOL CDibProcessDoc:DrawDib(HDC hDC, LPRECT lpDCRect, HGLOBAL hDIB, LPRECT lpDIBRect, CPalette* pPal /繪制Dib圖像BOOL bSuccess=FALSE; / 重畫成功標志HPALETTE hOldPal=NULL; / 以前的調(diào)色板 if (hDIB = NULL/ 判斷是否是有效的DIB對象 return FALSE;/ 不是,則返回 lpdib = (LPSTR :GlobalLock(HGLOBAL hDIB;/ 鎖定DIB lpDIBBit

13、s = GetBits(lpdib;/ 找到DIB圖象像素起始位置 if (pPal != NULL/ 獲取DIB調(diào)色板,并選取到設(shè)備環(huán)境中它HPALETTE hPal = (HPALETTE pPal->m_hObject; hOldPal = :SelectPalette(hDC, hPal, TRUE; :SetStretchBltMode(hDC, COLORONCOLOR;/ 設(shè)置顯示模式 bSuccess = :StretchDIBits(hDC, / 設(shè)備境句柄lpDCRect->left, /目標X坐標lpDCRect->top, / 目標Y坐標GetRect

14、Width(lpDCRect, / 目標寬度GetRectHeight(lpDCRect, / 目標高度lpDIBRect->left, / 源X坐標lpDIBRect->top, / 源Y坐標GetRectWidth(lpDIBRect, / 源寬度GetRectHeight(lpDIBRect, / 源高度lpDIBBits, / 指向dib像素的指針(LPBITMAPINFOlpdib, / 指向位圖信息結(jié)構(gòu)的指針DIB_RGB_COLORS, / 使用的顏色數(shù)目SRCCOPY; / 光柵操作類型 :GlobalUnlock(hDIB; / 解除鎖定if (hOldPal !

15、= NULL/ 恢復(fù)系統(tǒng)調(diào)色板:SelectPalette(hDC, hOldPal, TRUE; return bSuccess;在CDibProcessDoc:OnOpenDocument(LPCTSTR lpszPathName中添加讀取bmp文件的代碼如下:BOOL CDibProcessDoc:OnOpenDocument(LPCTSTR lpszPathName if (!CDocument:OnOpenDocument(lpszPathNamereturn FALSE;/ TODO: Add your specialized creation code here/讀取BMP文件到

16、file對象CFile file;if(!file.Open(lpszPathName,CFile:modeRead | CFile:shareDenyWritereturn FALSE;DeleteContents(; /刪除文檔數(shù)據(jù)/將指定的文件中的DIB對象讀到內(nèi)存區(qū)域中/DWORD dwFileSize;dwFileSize= file.GetLength(;/ 獲取文件大小 if (file.Read(LPSTR&bmfHeader, sizeof(bmfHeader != sizeof(bmfHeader/ 讀取DIB文件頭 return NULL;/ 大小不一致,返回NU

17、LL。if (bmfHeader.bfType != DIB_MARKER/ 判斷是否是DIB對象 return NULL;/ 如果不是則返回NULL。 m_hDib= (HGLOBAL :GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwFileSize-sizeof(BITMAPFILEHEADER;/ 分配DIB內(nèi)存if (m_hDib= 0 return NULL;/ 分配失敗,返回NULL/給位圖相關(guān)變量賦值 lpdib = (LPSTR :GlobalLock(HGLOBAL m_hDib;/ 鎖定lpbminfo=(BITMAPINFO*l

18、pdib;lpbmihrd=(BITMAPINFOHEADER*lpdib;lpRgbQuag=(RGBQUAD*(lpdib+lpbmihrd->biSize;int m_numberOfColors =GetColorNum(LPSTRlpbmihrd;if (lpbmihrd->biClrUsed = 0lpbmihrd->biClrUsed =m_numberOfColors;DWORD colorTableSize = m_numberOfColors *sizeof(RGBQUAD;lpDIBBits=lpdib+lpbmihrd->biSize+colorTableSize;/if (file.ReadHuge(lpdib, dwFileSize - sizeof(BITMAPFILEHEADER !=/ 讀像素dwFileSize - sizeof(BITMAPFILEHEADER /大小不一致 :GlobalUnlock(HGLOBAL m_hDib; / 解除鎖定 :GlobalFree(HGLOBAL m_hDib; / 釋放內(nèi)存return NULL

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論