之前MATLAB部分遇到一個問題,我在Hough變換完成之後得到的圖像需要進一步的處理,但是我是通過在之前的圖像上用循環遍歷添加上點,這樣的到的圖片使用句柄保存只能得到循環運算之前的原圖,暫時沒有找到解決方法,就先開始準別C語言的讀取BMP文件的方法
C語言讀取BMP文件
以下爲按照BMP格式相搭配的讀取頭文件
/* 位圖文件頭 (位圖頭的字節數 = 位圖文件字節數 - 位圖圖像數據字節數)*/
偏移量 | 域名稱 | 大小 | 內容 |
---|---|---|---|
0000H | 文件標識 | 2 | 識別位圖的類型 |
0002H | File Size | 4 | 表示文件的大小,單位是B |
0006H | Reserved | 4 | 保留信息,用處目前不明只知道必須爲0 |
000AH | Bitmao Data Offset | 4 | 從文件開始到位圖數據之間的偏移量 |
typedef struct BMP_FILE_HEADER
{
WORD bType; // 文件標識符
DWORD bSize; // 文件的大小
WORD bReserved1; // 保留值,必須設置爲0
WORD bReserved2; // 保留值,必須設置爲0
DWORD bOffset; // 文件頭的最後到圖像數據位開始的偏移量
} BMPFILEHEADER; // 14 字節
/* 位圖信息頭 */
偏移量 | 域名稱 | 大小 | 內容 |
---|---|---|---|
000EH | Bitmap Header Size | 4 | 位圖的信息頭的長度,一般是28H |
0012H | Width | 4 | 位圖的寬度,單位是像素 |
0016H | Height | 4 | 位圖的高度,單位是像素 |
001AH | Planes | 4 | 位圖的位面數,肯定是1 |
001CH | Bit per pixel | 2 | 每個像素的位數,1\4\8\16\24\32,分別表示2的N次方的色位,單色圖像默認爲1,即只有黑白 |
001EH | Comression | 4 | 壓縮說明,0:不壓縮;1:使用8位RLE壓縮方式;2:使用4位RLE壓縮方式;3:Bitfields-位域存放方式 |
0022H | Bitmap Data SIze | 4 | 用字節數字表示的位圖數據的大小,必須是4的倍數 |
0026H | HResolution | 4 | 用像素表示水平分辨率 |
002AH | VResolution | 4 | 用像素表示垂直分辨率 |
002EH | Colors | 4 | 位圖使用的顏色數 |
0032H | Important Colors | 4 | 指定的重要的顏色數,當數值等於Colors的數值的時候表示所有顏色一樣重要 |
typedef struct BMP_INFO
{
DWORD bInfoSize; // 信息頭的大小
DWORD bWidth; // 圖像的寬度
DWORD bHeight; // 圖像的高度
WORD bPlanes; // 圖像的位面數
WORD bBitCount; // 每個像素的位數
DWORD bCompression; // 壓縮類型
DWORD bmpImageSize; // 圖像的大小,以字節爲單位
DWORD bXPelsPerMeter; // 水平分辨率
DWORD bYPelsPerMeter; // 垂直分辨率
DWORD bClrUsed; // 使用的色彩數
DWORD bClrImportant; // 重要的顏色數
} BMPINF; // 40 字節
/* 彩色表:調色板 */
偏移量 | 域名稱 | 大小 | 內容 |
---|---|---|---|
____H | Palette | N*4 | 調色板規範,四個字節分別用來描述藍色、綠色、紅色和填充符的數值,在彩色圖像的處理中就是各個通道的作用 |
typedef struct RGB_QUAD
{
WORD rgbBlue; // 藍色強度
WORD rgbGreen; // 綠色強度
WORD rgbRed; // 紅色強度
WORD rgbReversed; // 保留值
}
之後就是圖像信息數據:
偏移量 | 域名稱 | 大小 | 內容 |
---|---|---|---|
____H | Bitmap Data | – | 包含掃描的信息,掃描順序是從右向左,從上到下 |