圖像壓縮 -- BMP圖像格式詳解

文章首發於我的個人博客

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三通道圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章