vc 位圖操作 BITMAPINFO 賦值
BMP 文件結構分成以下幾個(gè)部分:
1 BITMAP FILEHEADER (BMP 文件頭)
2 BITMAP INFOHEADER (BMP 文件信息頭)
3 RGBQUAD (BMP 文件調色板)
4 BITMAP DATA (BMP 文件數據)
Windows 中位圖有兩種格式:
設備相關(guān)位圖 Device Depend Bitmap DDB
設備無(wú)關(guān)位圖 Device Independ Bitmap DIB
DDB 位圖格式 ------------ BITMAP(結構體) CBitmap(MFC類(lèi)) HBITMAP(HANDLE)
由 BITMAP 數據類(lèi)型的結構 + 圖像數據構成。
因為DDB沒(méi)有保存位圖的調色板,在不同類(lèi)設備顯示時(shí)可能造成完全失真。
DIB 位圖格式 ----------- BITMAPINFO
BITMAP INFOHEADER (BMP 文件信息頭) + RGBQUAD (BMP 文件調色板) + BITMAP DATA (BMP 文件數據) 三部分構成
它實(shí)際就是BMP文件去掉BITMAP FILEHEADER (BMP 文件頭),即一個(gè)BITMAPINFO結構后面接上調色板再加上圖像數據。
BMP文件的顯示 ---- DIB
首先將BMP讀成DIB格式,當顯示時(shí)直接DIB顯示,只要讀入BITMAPINFO結構和圖像數據即可。
BMP文件的顯示 ---- DDB
首先要先將DIB位圖轉化為DDB位圖,再由MFC的CBitmap類(lèi)顯示。
總結: 統一使用DIB顯示,即 BITMAPINFO;//個(gè)人意見(jiàn)
不要使用以下:BITMAP(結構體) CBitmap(MFC類(lèi)) HBITMAP(HANDLE)//個(gè)人意見(jiàn)
//**********************************************
重點(diǎn)說(shuō)說(shuō) BITMAPINFO MFC中的定義如下:
typedef struct tagBITMAPINFO {
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;
這個(gè)結構體定義很奇怪,大概的意思是兼容沒(méi)有調色板的情況,不看它的寫(xiě)法,
依據BITMAPINFO的大小為 sizeof(BITMAPINFOHEADER) + numQuad * sizeof(RGBQUAD)
BITMAPINFOHEADER INFO_HEADER; //信息頭
//====================BITMAPINFO 說(shuō)明=====================================
typedef struct tagBITMAPINFO {
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;
在一個(gè)結構體定義
RGBQUAD bmiColors[1];
是很危險也非常巧妙的不得已的辦法,它的存在只為照顧bmp文件而存在;
因此使用BITMAPINFO有很多限制:
限制一 RGBQUAD bmiColors[1];此類(lèi)設置只能存在1個(gè),且必在最后
限制二 RGBQUAD類(lèi)型必為4字節的整倍數
限制三 雖然sizeof(BITMAPINFO) = 40 + 4 = 44;
bmp文件的字節是連續的(當然任何文件都是連續的),在文件中,緊隨BITMAPINFOHEADER之后是調色板,如果沒(méi)有調色板,緊隨BITMAPINFOHEADER之后是數據,注意如果沒(méi)有調色板,在BITMAPINFOHEADER與數據之間沒(méi)有任何字節存在,為了照顧bmp文件BITMAPINFO被設計成這樣,bmiColors[1]是個(gè)數組,它存放了數組的第1個(gè)元素,也就是bmiColors[0],接下來(lái)一定是bmiColors[1](此bmiColors[1]表示RGBQUAD數組的第2個(gè)元素,而B(niǎo)ITMAPINFO中RGBQUAD bmiColors[1];則表示定義一個(gè)類(lèi)型,是一個(gè)數組,因為數組是連續存儲的,這樣設計才能保證與bmp文件結構吻合),好亂~
申請內存也可這樣寫(xiě):
BITMAPINFO *pBMP_INFO = (BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER) + numQuad * sizeof(RGBQUAD));
BITMAPINFO *pBMP_INFO = new BITMAPINFO[sizeof(BITMAPINFOHEADER) + numQuad * sizeof(RGBQUAD)];
聯(lián)系客服