BMP文件格式


偶爾在網上看到大神的筆記,現系統的學習一遍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個字節

位圖數據

每個像素占一個字節,取得該字節后,以該字節為索引查詢相應的顏色,並顯示到相應的顯示設備上,由於信息頭中圖像的高度為正數,故位圖數據在文件中排列是從左下角到右上角,以行為主序排列的

參考

1、BMP文件格式詳解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM