1. 真彩色圖: 它的顏色數高達256×256×256種,也就是說包含我們上述提到的R、G、B顏色表示方法中所有的顏色。真彩色圖是說它具有顯示所有顏色的能力,即最多可以包含所有的顏色。
1.2 bmp文件格式
(WORD爲無符號16位整數,DWORD爲無符號32位整數,LONG爲32長整型)
1. bmp文件大體上分成四個部分:
1)位圖文件頭BITMAPFILEHEADER,共14個字節。
2)位圖信息頭BITMAPINFOHEADER,共40個字節。
3)調色板Palette
4)實際的位圖數據ImageDate
調色板實際上是一個數組,共有biClrUsed個元素(如果該值爲零,則有 個元素)。數組中每個元素的類型是一個RGBQUAD結構,佔4個字節。(紅色,綠色與藍色的排序與一般圖像文件的顏色數據排序恰好相反~)
對於用到調色板的位圖,圖象數據就是該象素顏在調色板中的索引值。對於真彩色圖,圖象數據就是實際的R、G、B值
2. 要注意兩點:
1) 每一行的字節數必須是4的整倍數,如果不是,則需要補齊。
2) 一般來說,BMP文件的數據從下到上,從左到右的。
一,loadBmpFile函數實現過程:
1. 打開文件到HFILE結構變量中。
2. 從HFILE變量中讀取BITMPFILEHEADER和BITMAPINFOHEADER兩個結構變量。
3. 計算圖像行字節數和圖像總字節數。
4. 計算實際使用到的顏色個數並驗證結果.
5. 填寫bf.bfsize;
6. 分配全局內存空間,大小爲(bitmapinfoheader+palette+實際圖像)返回一個句柄。
7. LPBITMAPINFOHEADER指向分配的全局內存空間。
8. 文件指針重新定位到BITMAPINFOHEADER開始處並將內容讀入LPBITMAPINFOHEADER類型指針中。關閉文件。_hread和_lread的區別。
9. NumColors不爲零時,說明用到了調色板。爲邏輯調色板分配局部內存,大小爲邏輯調色板結構長度加NumColors個PALETTENTRY。
10.LOGPALETTE類型指針pPal指向該內存區,填寫邏輯調色板結構的頭。lpRGB指向的是調色板開始的位置,填寫pPal->palPalEntry的每一項。
11.產生邏輯調色板全局變量hPalette,解鎖並釋放局部內存。
12.獲得設備上下文句柄。
13.如果產生了邏輯調色板,將新的邏輯調色板選入DC,將舊的邏輯調色板句柄保存在hPrevPalette中。
14.產生位圖句柄。使用完現在的調色板,就要把原來的調色板還原至DC中。
15.釋放設備上下文,解鎖內存區。
二,響應WM_PAINT消息:
1. 獲得屏幕設備上下文BeginPaint和GetDC的區別。
2. 建立一個內存設備上下文。當有調色板,將調色板選入屏幕設備上下文和內存設備上下文。
3. 將位圖選入內存設備上下文,顯示位圖,釋放內存設備上下文,釋放屏幕設備上下文。
注意:1)要2個DC的原因是,在繪製位圖時要將源(內存)設備上下文的內容複製到目的(屏幕)設備上下文中。
書提供的代碼運行都有問題,經過修改,錯誤是沒了,不過就是圖片顯示不出來!而且對它的代碼還有一些不太明白,比如系統如何發送WM_LOADBITMAP這個消息的呢?
終於解決了!!
答:看書上提供的代碼時沒有注意到有一個.rc爲後綴的資源文件,裏面定義了一個menu,menu裏面有一個子控件open,它和WM_LOADBITMAP關聯。以前從來沒想過去手動編輯資源文件,要不是昨天開始嘗試使用dos下編譯c++文件,怎麼也沒想要打開這個文件看看。看來放一放還是對了,忍了這麼久終於解放了!稍後寫一篇關於如果VC資源文件結構的文章,對以後學習有幫助。