VC++數字圖像處理 楊淑瀅
本文對該老師的代碼進行總結,代碼小白順便補充一下自己比較困惑的知識點,方便后續復習。
- 對於BMP格式的圖像結構分為以下四個部分:
位圖文件頭結構BITMAPFILEHEADER |
位圖信息頭結構BITMAPINFOHEADER |
位圖顏色表RGBQUAD |
位圖像素數據部分 |
- 對於位圖的圖像分為四類:
- 單色圖像:有兩個值:0,255其中0表示黑,255表示白(也可以進行歸一化處理為0和1)。
- 灰度圖像:帶有顏色表,相當於索引表。RGB的分量值相同。
- 偽彩色圖像:RGB的分量不完全相同,帶有顏色表,相當於索引,整個圖像256種顏色。
- 24位真彩色圖像:沒有調色表,RGB三分量各占8位。
- 對於C++中結構體結構的介紹:
在c++中如果用typedef的話:
struct Student
{
int a;
}stu1;//stu1是一個變量
typedef struct Student2
{
int a;
}stu2;//stu2是一個結構體類型=struct Student
即在C++中用typedef相當於重命名操作,相當於對struct后面的變量重新命名。
- 對於變量中的類型別名問題—引入頭文件“windowsX.h"
windef.h——基本型態定義
winbase.h——Kernel函數
wingdi.h——圖形設備接口函數
winuser.h——使用者接口函數
其中這里主要使用的是第一個應用:基本形態定義,這里面定義了宏,方便后面的使用。
1 typedef unsigned long DWORD; 2 typedef int BOOL; 3 typedef unsigned char BYTE; 4 typedef unsigned short WORD; 5 typedef float FLOAT;
於是可以將BMP圖像的格式用代碼的方式展現出來
位圖文件頭:
1 typedef struct tagBITMAPFILEHEADER 2 { 3 WORD bftype;//表示2個字節,16位的短整數,用來判斷是否為位圖文件類型 4 DWORD bfsize;//表示4個字節,位圖文件的大小。 5 WORD bfReaserved1;//位圖文件的保留字,必須為0. 6 WORD bfReaserved2;//位圖文件的保留字,必須為0 7 DWORD bfOffBits;//表示數據的起始位置 8 } BITMAPFILEHEADER;
位圖信息頭:
typedef struct tagBITMAPINFOHEADER { DWORD biSize;//本結構所占用字節數 LONG biWidth;//位圖的寬度,以像素為單位 LONG biHeight;//位圖的高度,以像素為單位 WORD biPlanes;//目標設備的級別,必須為1 WORD biBitCount;//每個像素所需的位數,1、4、8、24 DWORD biCompression;/*位圖壓縮類型,必須為0(不壓縮)、1(BI_RLE8壓縮類型)、2(BI_RLE4壓縮類型)之一*/ DWORD biSizeImage;//位圖的大小,以字節為單位 LONG biXPelsPerMeter;//位圖水平分辨率,每米像素數 LONG biYPelsPerMeter;//位圖垂直分辨率,每米像素數 DWORD biClrUsed;//位圖實際使用的顏色表的顏色數 DWORD biClrImportant;//位圖顯示過程中重要的顏色數 }BITMAPINFOHEADER;
顏色表:
typedef struct tagRGBQUAD { BYTE rgbBlue;//藍色的亮度(0~255) BYTE rgbGreen;//綠色 BYTE rgbRed;//紅色 BYTE rgbReserved;//保留,必須為0 }RGBQUAD;
把結構體構造結束之后,來構造BMP文件的類: