偶爾在網上看到大神的筆記,現系統的學習一遍BMP格式數組
選用的BMP文件爲 灰色lena圖佈局
用EditPlus以十六進制打開圖片:學習
BMP文件,又叫位圖,是Windows中使用的圖片格式。.net
文件格式:orm
一、bmp文件頭(bmp file header):提供文件的格式、大小等信息blog
二、位圖信息頭(bitmap information):提供圖像數據的尺寸、位平面數、壓縮方式、顏色索引等信息索引
三、調色板(color palette):可選,如使用索引來表示圖像,調色板就是索引與其對應的顏色的映射表圖片
四、位圖數據(bitmap data):就是圖像數據內存
24位圖像,即R、G、B三種顏色各用8bit表示,稱爲真彩色,這種狀況下不須要調色板,即位圖信息後緊跟着的就是位圖數據get
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-2:42 4d 爲「BM」,表示Windows支持的位圖格式,即指是BMP文件
二、3-5: 36 04 01 00 即0X00010436 等於66614 約爲65kb
三、6-9:00 00 00 00 保留字段1和2
四、a-d:36 04 00 00 即0X00000436等於1078,即數據從1078處開始
一共14個字節
Windows定義信息頭結構體以下:
對照數據文件:
一、0e-11:28 00 00 00 即0x00000028 等於40,即信息頭大小爲40bit
二、12-15:00 01 00 00 即0x00000100等於256,即圖像寬度爲255像素
三、16-19:00 01 00 00 即0x00000100等於256,即圖像高度爲255像素,且這是一個正數,說明圖像數據是從圖像左下角到右上角排列的
四、1a-1b:0100 即0x00010,等於1,即顏色平面數爲1
五、1c-1d:0800 即0x0008.等於8,即每一個像素佔8bit
六、1e-21:00 00 00 00 即0,BI_RGB格式
七、22-25:00 00 01 00 即0x00010000 等於65536.指圖像大小
八、26-29:00 00 00 00 等於0.水平分辨率
九、2a-2d:00 00 00 00 等於0 垂直分辨率
十、2e-31:00 01 00 00 即0x00000100 等於256,指實際使用的顏色索引數256
十一、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個字節
每一個像素佔一個字節,取得該字節後,以該字節爲索引查詢相應的顏色,並顯示到相應的顯示設備上,因爲信息頭中圖像的高度爲正數,故位圖數據在文件中排列是從左下角到右上角,以行爲主序排列的