BMP位圖格式的內存存儲格式
**********************************************************************************************************
2018-05-29 實驗室 晚上整理總結
參考博客:https://blog.csdn.net/q673327335/article/details/8432384
***********************************************************************************************************
BMP(全稱Bitmap)是Window操作系統中的標準圖像文件格式
可以分成兩類:設備相關位圖(DDB)和設備無關位圖(DIB),使用非常廣。
它采用位映射存儲格式,除了圖像深度可選以外,不采用其他任何壓縮,因此,BMP文件所占用的空間很大。BMP文件的圖像深度可選lbit、4bit、8bit及24bit。BMP文件存儲數據時,圖像的掃描方式是按從左到右、從下到上的順序。由於BMP文件格式是Windows環境中交換與圖有關的數據的一種標準,因此在Windows環境中運行的圖形圖像軟件都支持BMP圖像格式。
組成
典型的BMP圖像文件由四部分組成:
1:位圖頭文件數據結構,它包含BMP圖像文件的類型、顯示內容等信息;
2:位圖信息數據結構,它包含有BMP圖像的寬、高、壓縮方法,以及定義顏色等信息;
3:調色板,這個部分是可選的,有些位圖需要調色板,有些位圖比如真彩色圖(24位的BMP)就不需要調色板;
4:位圖數據,這部分的內容根據BMP位圖使用的位數不同而不同,在24位圖中直接使用RGB,而其他的小於24位的使用調色板中顏色索引值。
***********************************************************************************************************
1、彩色BMP圖片
54個字節的圖像頭文件 + width*height*3的圖像數據
數據排列方式:B G R(第一個像素點) B G R(第一個像素點) ... ... ...
2、灰度圖BMP
54字節的圖像頭文件 + 1024個字節的調色板 + width*height的數據
***********************************************************************************************************
可以用besnew軟件打開圖片,查看內部存儲格式
比如一張8192*2048的灰度圖(有1024的顏色表)
存儲格式: 低位 高位
1.位圖文件頭
0,1:42 4D 為位圖的標誌。如果轉換成 ASCII 碼的話就是 BM。
2-5:(01 00 04 36)H = 16,778,294(bytes),表示文件大小為16,778,294bytes,也可以通過查看文件大小信息知道。
6-9:(00 00 00 00)H為保留字。
10-13:(00 00 04 36)H = 1078D,文件起始位置標誌,表示文件從第54+1024=1078位開始。
2.位圖信息頭
14-17:(00 00 00 28)H = 40D,表示位圖信息頭的長度,即為40 bytes。
18-21:(00 00 20 00)H = 8192D,表示位圖寬度,即為8192 pixels。
22-25:(00 00 08 00)H = 2048D,表示位圖高度,即為2048 pixels。存儲方式為從最後一行先存,最後存第一行//高度值為負數,則表示存儲順序為從上到下
26-27:(00 01)H,表示設備級別
28-29:(00 08)H = 8D,表示位圖色彩級別,即為 8位灰度圖。
30-33:(00 00 00 00)H,表示壓縮類型,0表示不壓縮
34-37:(01 00 00 00)H = 16,777,216D,位圖陣列表字節數,即為921600 bytes。
38-41:(00 00 00 00)H,表示水平分辨率
42-45:(00 00 00 00)H,表示垂直分辨率
46-49:(00 00 01 00)H,表示位圖實際使用的顏色表中的顏色變址。
50-53:(00 00 00 00)H,表示位圖顯示過程中被認為重要顏色變址數。
3.顏色表
顏色表用於說明(灰度圖)位圖中的顏色,它有若幹個表項,每一個表項是一個RGBQUAD類型的結構,定義一種顏色。RGBQUAD結構的定義如下:
typedef struct tagRGBQUAD {
BYTE rgbBlue;// 藍色的亮度(值範圍為0-255)
BYTE rgbGreen; // 綠色的亮度(值範圍為0-255)
BYTE rgbRed; // 紅色的亮度(值範圍為0-255)
BYTE rgbReserved;// 保留,必須為0
} RGBQUAD;
我們平時看到的偽彩色圖,可以對應著改變BGR的值,比如顏色表索引24,將BGR分別改為15,25,75等,就可以出現偽彩色圖。
4.像素存儲組織方式
BMP存儲像素值的方式為從下至上,從左至右,緊隨著文件頭存儲的字節為圖像最下一行的數值,從左下角開始依次存儲。
22 22 22 23 ... 為圖像左下角像素的數值,依次向右存儲,最後一行掃描完後,緊接著存儲上一行,最後一個byte存儲的是圖像右上角像素的數值。
可用MATLAB讀取BMP圖片後對比內存存放方式,就一目了然了。
BMP位圖格式的內存存儲格式