BMP圖檔的格式,在「點陣圖 (Bitmap) 檔案格式」一文中有詳細的介紹,前陣子也遇到要處理這種格式的問題,所以趁著還有一點記憶把資料整理一下,一方面做筆記備份,一方面供有需要的人參考。
註:(英) Wikipedia BMP、(簡) Wikipedia BMP
BMP格式簡單的說就是「File Header + Info Header + (optional palette) + Raw Data」,不過我遇到的例子都是「File Header + Info Header + Raw Data」比較多,範例也將用此格式為例。
【FILE HEADER 實例圖解】14 bytes
/* type : Magic identifier,一般為BM(0x42,0x4d) */
unsigned short int type;
unsigned int size;/* File size in bytes,全部的檔案大小 */
unsigned short int reserved1, reserved2; /* 保留欄位 */
unsigned int offset;/* Offset to image data, bytes */
} FILEHEADER;
- type:2 bytes,一般都是’B‘ (0x42)、’M‘ (0x4D)
- size:4 bytes,記錄該BMP檔的大小,0x436 = 1078 bytes
- reserved1:保留欄位,2 bytes
- reserved2:保留欄位,2 bytes
- offset:4 bytes,0x36 = 54 bytes
【INFO HEADER 實例圖解】40 bytes
unsigned int size;/* Info Header size in bytes */
int width,height;/* Width and height of image */
unsigned short int planes;/* Number of colour planes */
unsigned short int bits; /* Bits per pixel */
unsigned int compression; /* Compression type */
unsigned int imagesize; /* Image size in bytes */
int xresolution,yresolution; /* Pixels per meter */
unsigned int ncolours; /* Number of colours */
unsigned int importantcolours; /* Important colours */
} INFOHEADER;
- size:4 bytes,0x28 = 40 bytes,表示Info Header的大長度總共 40 bytes
- width:4 bytes,0x10 = 16,圖檔寬度為16 pixel
- height:4 bytes,0x10 = 16,圖檔高度為16 pixel
- planes:2 bytes,0x01 = 1,位元圖層數為1
- bits:2 bytes,0x20 = 32,每個pixel需要32bits
- compression:4 bytes,0代表不壓縮
- imagesize:4 bytes,0x400 = 1024 bytes,點陣圖的資料大小為1024 bytes
- xresolution:4 bytes,水平解析度
- yresolution:4 bytes,垂直解析度
- ncolours:4 bytes,點陣圖使用的調色盤顏色數
- importantcolours:4 bytes,重要的顏色數
【RAW DATA 實例圖解】
剛剛的File Header共14bytes,Info Header為40bytes,「imagesize」 = 1024 bytes,所以「14 + 40 + 1024 = 1078」,即等於File Header中「size」的大小。下圖我只擷取部分的資料,反正全部的檔案,減去Header檔54位元組,剩下的就是點陣圖的資料。
在Info Header中的「bits」為32 bits,故四個位元組一組,若24 bits,則三個位元組一組,例子中的長寬各為16,以「Z」字型來看,一列則為16組,即16 X 4 = 64 bytes。注意的是,圖中是以A、B、C ~ …的讀取順序來解說,但實際上程式所讀取到的通常會是反過來的,即… ~ C、B、A。另外,下圖是以「BGRA」排列。
註:我對這個格式還沒研究很透徹,有錯的話請不吝指教,謝謝。
參考資料:
.點陣圖(Bitmap)檔案格式
.BMP Image Format