mfc讀取并顯示圖片和彩色轉(zhuǎn)灰度

mfc讀取并顯示圖片和彩色轉(zhuǎn)灰度

ID:8960813

大?。?0.01 KB

頁數(shù):6頁

時間:2018-04-13

mfc讀取并顯示圖片和彩色轉(zhuǎn)灰度_第1頁
mfc讀取并顯示圖片和彩色轉(zhuǎn)灰度_第2頁
mfc讀取并顯示圖片和彩色轉(zhuǎn)灰度_第3頁
mfc讀取并顯示圖片和彩色轉(zhuǎn)灰度_第4頁
mfc讀取并顯示圖片和彩色轉(zhuǎn)灰度_第5頁
資源描述:

《mfc讀取并顯示圖片和彩色轉(zhuǎn)灰度》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫

1、VC6.0MFC讀取并顯示圖片和彩色轉(zhuǎn)灰度By侯海艷(UCAS)關(guān)于MFC讀取BMP圖片,相信對于很多初學(xué)者都是一頭霧水,找不著頭緒。那么就讓我淺淺地說一說到底怎么樣讀取并顯示BMP圖片吧。因為我也是初學(xué),摸索學(xué)習(xí)了四五天,由于有些MFC基礎(chǔ),因此大概理清了MFC讀取圖片的機理。說的不對請?zhí)岢鰧氋F建議,高手請繞道。C++的學(xué)習(xí)難就難在指針上面,我們必須很好地了解數(shù)據(jù)的存儲方式和指針的基本知識。一般來說,數(shù)據(jù)存儲在內(nèi)存中是以內(nèi)存塊的形式存儲的,即給變量分配一定大小的空間,這個空間就像書架一樣,里面裝滿了一本一本的書

2、,每本書就對應(yīng)著一個數(shù)據(jù)單元。我們定義一個指針,指向這個內(nèi)存塊,指針的位置就在內(nèi)存塊的開頭,即數(shù)據(jù)的第一個元素。當(dāng)我們要獲取后面的元素的時候就要移動指針獲取。下面會具體說。MFC讀取BMP圖片的形式有兩種(這兩種僅僅是我實踐過的,也許還有別的方法):第一種就是根據(jù)BMP文件的存儲方式,按照這種方式自己寫代碼讀??;第二種可以利用兩個頭文件DIBAPI.H和DIBAPI.CPP,這兩個文件定義了讀取和獲取DIB文件的各種方法,網(wǎng)上可以獲取這兩個文件。DIB(Device-IndependentBitMap)就是數(shù)據(jù)無

3、關(guān)位圖,其實就是BMP文件的一種,這里不多做解釋。1.從新建MFC文檔開始新建MFC文檔的時候,可以選擇多文檔類型,一般選擇默認(rèn),但有一點需要注意,當(dāng)新建這只到了第六步的時候,C*View類的BaseClass要選擇CScrollView,而不是默認(rèn)的CView。如下圖:Teeee是我隨便命名的工程名(旋轉(zhuǎn)了90度)這樣打開文檔就可以看到上圖中有許多文件,我們所要編輯的主要是Doc.cpp、View.cpp和HeaderFiles里面的Doc.h頭文件。在Doc.cpp里面有OnOpenDocument()函數(shù),

4、這個是執(zhí)行打開文件時響應(yīng)的函數(shù)。讀取文件可以在這個里面進行。View.cpp是用來顯示圖片的。Doc.h里則可以定義一些變量和函數(shù)。具體細(xì)節(jié)不說,這里主要說關(guān)鍵的讀取和顯示圖片的方法??梢杂肍ILE定義一個指向文件的指針pFile。定義一個文件頭BITMAPFILEHEADERFilehdr;定義一個信息頭BITMAPINFOHEADERInfohdr;當(dāng)為彩色圖像時沒有顏色表,不需要定義顏色表,為灰度圖像時有顏色表,這時可以定義一個RGBQUAD或BYTE類型的顏色表用以存儲顏色表數(shù)據(jù)。下面可以在定義一個數(shù)據(jù)部

5、分緩沖區(qū),即指針文件BYTE*pImgData,*pGrayData,這兩項要定義在Doc.h文件里,以便畫圖時使用。要注意的是,DIB文件一行數(shù)據(jù)的字節(jié)數(shù)必須是4的倍數(shù),比如一個9行9列的灰度圖,一個像素占1字節(jié),那么一行9個像素就占9個字節(jié),但是給這行數(shù)據(jù)分配存儲單元的時候卻是分配了12個字節(jié)。計算公式可以用(RowBytes=((m_Width*m_PxlBytes*8+31)/32)*4),RowBytes每行字節(jié)數(shù),m_Width是圖像寬度(每行像元個數(shù)),m_PxlBytes是每個像素占的字節(jié)數(shù),灰度

6、圖是每像素占1字節(jié),24位的RGB圖則是3個字節(jié)。下面附上部分關(guān)鍵代碼:FILE*pFile;if((pFile=fopen(lpszPathName,"r"))==NULL)returnFALSE;//讀取位圖文件頭BITMAPFILEHEADERFilehdr;fread(&Filehdr,sizeof(BITMAPFILEHEADER),1,pFile);//讀取文件頭if(Filehdr.bfType!=0x4D42){AfxMessageBox(_T("請打開bmp格式文件!"));//格式不對就要重新

7、打開returnFALSE;}//讀取位圖信息頭BITMAPINFOHEADERInfohdr;fseek(pFile,sizeof(BITMAPFILEHEADER),SEEK_SET);//將文件流指針向后移動文件頭大小的位置處,以便讀取信息頭fread(&Infohdr,sizeof(BITMAPINFOHEADER),1,pFile);//指針在位圖信息頭的位置處,直接讀取位圖信息頭/***文件大小以及表示顏色時所用的位數(shù)******/m_Width=Infohdr.biWidth;m_Height=In

8、fohdr.biHeight;m_BitCount=Infohdr.biBitCount;//為什么除以8?m_PxlBytes=Infohdr.biBitCount/8;/****************************************/if(m_PxlBytes!=1&&m_PxlBytes!=3){AfxMessageBox("只能讀取8位或24位真

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。