1.1 位元影像和調色盤的概念
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檔案的資料從下到上,從左至右的。
1.3 顯示一個bmp檔案的C程式
一,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資源檔結構的文章,對以後學習有協助。