文章首發於我的個人博客
BMP又稱爲BitMap(位圖)。BMP文件的圖像深度可選lbit、4bit、8bit及24bit。但一般的bmp圖像以24位圖像爲主,即用R、G、B三種顏色各用8個bit來表示,這樣的圖像我們稱爲真彩色,這種情況下是不需要調色板的,也就是所位圖信息頭後面緊跟的就是位圖數據了。因此,這種情況下,bmp圖像從文件頭開始偏移54個字節就是bmp的圖像數據了。
下面將用Notepad++爲分析工具來對BMP圖像格式做一個剖析。
我使用的圖像如下(圖像大小爲1.17MB):
需要注意的是,windows下bmp內部的存儲方式位小端方式,即“低位地址存放低位數據,高位地址存放高位數據”。
1. BMP數據從文件頭開始的先後順序分別爲:
- bmp文件頭:提供文件的格式、大小等信息,共14字節。
- bmp信息頭:提供圖像數據的尺寸、位平面數、壓縮方式、顏色索引等信息,共40字節。
- 調色板:可選
- 位圖數據:圖像數據。
2. BMP文件頭
變量名 | 大小 | 作用 |
---|---|---|
bfType | 2 bytes | 說明文件的類型 |
bfSize | 4 bytes | 說明該位圖的大小 |
bfReserved1 | 2 bytes | 保留,必須設置0 |
bfReserved2 | 2 bytes | 保留,必須設置爲0 |
bf0ffBits | 4 bytes | 說明從文件頭開始到實際的圖像數據之間的字節的偏移量 |
對比bmp圖像數據
之前提到,windows下bmp存儲方式爲小端存儲,因此
- bfType : 4d42H
- bfSize : 0012c036H = 1,228,854 bytes = 1.17MB,與之前提到的圖像大小一致。
- bfReserved1 : 0000H
- bfReserved2 : 0000H
- bf0ffBits : 00000036H = 54 bytes,即從文件頭到圖像數據需要偏移54個字節,這個我們後面再做驗證。
3. BMP信息頭
變量名 | 大小 | 作用 |
---|---|---|
biSize | 4 bytes | 描述信息頭結構體所需的字節 |
biWidth | 4 bytes | 說明圖像的寬度,以像素爲單位 |
biHeight | 4 bytes | 說明圖像的高度,以像素爲單位 |
biPlanes | 2 bytes | 爲目標設備說明顏色平面數,其值總是爲1 |
biBitCount | 2 bytes | 說明比特數,1、4、8、16、24或32 |
biCompression | 4 bytes | 說明圖像數據壓縮的類型。0 BI_BGB(不壓縮,最常用) |
biSizeImage | 4 bytes | 說明圖像的大小 |
biXPelsPerMeter | 4 bytes | 說明水平分辨率,用像素/米表示 |
biYPelsPerMeter | 4 bytes | 說明垂直分辨率,用像素/米表示 |
biClrUsed | 4 bytes | 說明位圖實際使用的彩色表中的顏色所引述 |
biClrImportant | 4 bytes | 說明對圖像顯示有重要影響的顏色索引的數目 |
對比bmp圖像數據
- biSize : 00000028H = 40 bytes,之前已經說過,位圖信息頭佔40字節。
- biWidth : 00000280H = 640,即圖像寬度爲640像素,與文件屬性一致。
- biHeight : 00000280H = 640,即圖像高度爲640像素,與文件屬性一致。
- biPlanes : 0001H = 1
- biBitCount : 0018H = 24。由於是24位的bmp,因此沒有調色板數據,文件頭和信息頭之後就是真正的圖像數據。
- biCompression : 00000000H = 0 ,即不壓縮。
- biSizeImage : 0012c000H = 1.17MB,即圖像大小爲1.17MB。
- biXPelsPerMeter : 00001274H
- biYPelsPerMeter : 00001274H
- biClrUsed : 00000000H
- biClrImportant : 00000000H
4. 圖像數據
24位RGB按照BGR
的順序來存儲每個像素的各個顏色通道的值,一個像素的所有顏色分量都存完之後才進行下一個像素的存儲。像素的排布順序爲“從下到上,從左到右”。
對比bmp圖像數據
位圖數據在文件中的排列順序是從左下角到右下角,首先排行,其次排列。以上圖爲例,即a3、87、51爲最後一行第一列數據,a3、87、51爲最後一行第二列數據,以此類推…
參考資料
[1] BMP文件格式詳解(BMP file format)
[2] BMP位圖轉爲RGB三通道圖