數字圖像處理編成入門筆記——第一章Windows位圖和調色板

1.1 位圖和調色板的概念

1. 真彩色圖: 它的顏色數高達256×256×256種,也就是說包含我們上述提到的RGB顏色表示方法中所有的顏色。真彩色圖是說它具有顯示所有顏色的能力,即最多可以包含所有的顏色。

 

1.2 bmp文件格式

(WORD爲無符號16位整數,DWORD爲無符號32位整數,LONG32長整型)

1.      bmp文件大體上分成四個部分:

1)位圖文件頭BITMAPFILEHEADER,共14個字節。

2)位圖信息頭BITMAPINFOHEADER,共40個字節。

3)調色板Palette

4)實際的位圖數據ImageDate

調色板實際上是一個數組,共有biClrUsed個元素(如果該值爲零,則有 個元素)。數組中每個元素的類型是一個RGBQUAD結構,佔4個字節。(紅色,綠色與藍色的排序與一般圖像文件的顏色數據排序恰好相反~)

對於用到調色板的位圖,圖象數據就是該象素顏在調色板中的索引值。對於真彩色圖,圖象數據就是實際的RGB

 

2. 要注意兩點:

1) 每一行的字節數必須是4的整倍數,如果不是,則需要補齊。

2) 一般來說,BMP文件的數據從下到上,從左到右的

 

1.3 顯示一個bmp文件的C程序

一,loadBmpFile函數實現過程:

1.    打開文件到HFILE結構變量中。

2.    HFILE變量中讀取BITMPFILEHEADERBITMAPINFOHEADER兩個結構變量。

3.    計算圖像行字節數和圖像總字節數。

4.    計算實際使用到的顏色個數並驗證結果.

5.    填寫bf.bfsize;

6.    分配全局內存空間,大小爲(bitmapinfoheader+palette+實際圖像)返回一個句柄。

7.    LPBITMAPINFOHEADER指向分配的全局內存空間。

8.    文件指針重新定位到BITMAPINFOHEADER開始處並將內容讀入LPBITMAPINFOHEADER類型指針中。關閉文件。_hread_lread的區別

9.    NumColors不爲零時,說明用到了調色板。爲邏輯調色板分配局部內存,大小爲邏輯調色板結構長度加NumColorsPALETTENTRY

10.LOGPALETTE類型指針pPal指向該內存區,填寫邏輯調色板結構的頭。lpRGB指向的是調色板開始的位置,填寫pPal->palPalEntry每一項。

11.產生邏輯調色板全局變量hPalette,解鎖並釋放局部內存。

12.獲得設備上下文句柄。

13.如果產生了邏輯調色板,將新的邏輯調色板選入DC,將舊的邏輯調色板句柄保存在hPrevPalette中。

14.產生位圖句柄。使用完現在的調色板,就要把原來的調色板還原至DC中。

15.釋放設備上下文,解鎖內存區。

 

二,響應WM_PAINT消息:

1.    獲得屏幕設備上下文BeginPaintGetDC的區別

2.    建立一個內存設備上下文。當有調色板,將調色板選入屏幕設備上下文和內存設備上下文。

3.    將位圖選入內存設備上下文,顯示位圖,釋放內存設備上下文,釋放屏幕設備上下文。

注意1)要2DC的原因是,在繪製位圖時要將源(內存)設備上下文的內容複製到目的(屏幕)設備上下文中。

 

   書提供的代碼運行都有問題,經過修改,錯誤是沒了,不過就是圖片顯示不出來!而且對它的代碼還有一些不太明白,比如系統如何發送WM_LOADBITMAP這個消息的呢?

 

終於解決了!!

答:看書上提供的代碼時沒有注意到有一個.rc爲後綴的資源文件,裏面定義了一個menu,menu裏面有一個子控件open,它和WM_LOADBITMAP關聯。以前從來沒想過去手動編輯資源文件,要不是昨天開始嘗試使用dos下編譯c++文件,怎麼也沒想要打開這個文件看看。看來放一放還是對了,忍了這麼久終於解放了!稍後寫一篇關於如果VC資源文件結構的文章,對以後學習有幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章