偶爾在網上看到大神的筆記,現系統的學習一遍BMP格式
選用的BMP文件為 灰色lena圖
用EditPlus以十六進制打開圖片:
BMP介紹
BMP文件,又叫位圖,是Windows中使用的圖片格式。
文件格式:
1、bmp文件頭(bmp file header):提供文件的格式、大小等信息
2、位圖信息頭(bitmap information):提供圖像數據的尺寸、位平面數、壓縮方式、顏色索引等信息
3、調色板(color palette):可選,如使用索引來表示圖像,調色板就是索引與其對應的顏色的映射表
4、位圖數據(bitmap data):就是圖像數據
真彩色
24位圖像,即R、G、B三種顏色各用8bit表示,稱為真彩色,這種情況下不需要調色板,即位圖信息后緊跟着的就是位圖數據
預備知識
1. 在BMP文件中,如果一個數據需要用幾個字節來表示的話,那么該數據的存放字節順序為“低地址村存放低位數據,高地址存放高位數據。如數據0x1756在內存中的存儲順序為:
這種存儲方式稱為小端方式(little endian) , 與之相反的是大端方式(big endian)。
2. 以下所有分析均以字節為序號單位進行。
下面我們對從文件中拉出來的數據進行剖析:
文件頭
Windows為bmp文件頭作出如下定義:
typedef struct tagBITMAPFILEHEADER { UINT16 bfType; //文件類型,2Byte DWORD bfSize; //文件大小, 4Byte UINT16 bfReserved1; // 保留字段1, 2Byte UINT16 bfReserved2; // 保留字段2, 2Byte DWORD bfOffBits; // 數據與文件頭的偏移量, 4Byte } BITMAPFILEHEADER;
其中:
對照文件,我們可見:
1、1-2:42 4d 為“BM”,表示Windows支持的位圖格式,即指是BMP文件
2、3-5: 36 04 01 00 即0X00010436 等於66614 約為65kb
3、6-9:00 00 00 00 保留字段1和2
4、a-d:36 04 00 00 即0X00000436等於1078,即數據從1078處開始
一共14個字節
信息頭
Windows定義信息頭結構體如下:
對照數據文件:
1、0e-11:28 00 00 00 即0x00000028 等於40,即信息頭大小為40bit
2、12-15:00 01 00 00 即0x00000100等於256,即圖像寬度為255像素
3、16-19:00 01 00 00 即0x00000100等於256,即圖像高度為255像素,且這是一個正數,說明圖像數據是從圖像左下角到右上角排列的
4、1a-1b:0100 即0x00010,等於1,即顏色平面數為1
5、1c-1d:0800 即0x0008.等於8,即每個像素占8bit
6、1e-21:00 00 00 00 即0,BI_RGB格式
7、22-25:00 00 01 00 即0x00010000 等於65536.指圖像大小
8、26-29:00 00 00 00 等於0.水平分辨率
9、2a-2d:00 00 00 00 等於0 垂直分辨率
10、2e-31:00 01 00 00 即0x00000100 等於256,指實際使用的顏色索引數256
11、32-35:00 00 00 00 即0,指重要的顏色索引數為0
至此,文件頭+信息頭 = 64Byte
調色板
一張映射表,布局想二維數組[N][4],N指總的顏色所引數,每行四個元素對應B、G、R和Alpha值,一個分量一個字節,若無透明通道,則Alpha為0
對照數據文件:
本圖中,N=256.即256個顏色索引
索引 | B | G | R | Alpha |
0 | 00 | 00 | 00 | 00 |
1 | 01 | 01 | 01 | 00 |
2 | 02 | 02 | 02 | 00 |
3 | 03 | 03 | 03 | 00 |
4 | 04 | 04 | 04 | 00 |
5 | 05 | 05 | 05 | 00 |
..... | ...... | ...... | ...... | ...... |
一共256種顏色,每個顏色占一個字節,一共是1024個字節,加上文件頭和信息頭的54字節,一共是1078個字節,即在數據之前有1078個字節
位圖數據
每個像素占一個字節,取得該字節后,以該字節為索引查詢相應的顏色,並顯示到相應的顯示設備上,由於信息頭中圖像的高度為正數,故位圖數據在文件中排列是從左下角到右上角,以行為主序排列的