這次使用到的 是"單色點陣圖(使用 2 色調色盤)" , 因此只研究這個。
BMP格式 : 主要由 4 個部分組成 【 File Header + Info Header + optional palette + Image Raw Data 】
【File Header】14 bytes
File Header Format |
【註1】若使用gcc編譯 , "unsigned short bfType" 會自動padding成 4 bytes, 因此讀取資料會有問題 .
所以需要在Data Structure 前 , 加以下兩行code , 強迫gcc 以 2 bytes為單位。
#pragma pack(push) /* push current alignment to stack */
#pragma pack(2) /* set alignment to 2 byte boundary */
所以需要在Data Structure 前 , 加以下兩行code , 強迫gcc 以 2 bytes為單位。
#pragma pack(push) /* push current alignment to stack */
#pragma pack(2) /* set alignment to 2 byte boundary */
2. bfSize : 0x0000043E = 1086 (檔案大小)
3. bfOffBit : 0x0000003E = 62 (從檔案頭算起第62位置開始是 Image Data)【註2】 該系統為 little-endian. 從code讀取 bfType = 0x4D42 . 但從UltraEdit 編輯器打開時,
看到的值為 0x424D(實際儲存在memory的順序) , 這是 Intel 制定的儲存方式,
把值小的位元組(0x4D)存在前面
【Info Header】40 bytes
【Info Header 範例】
1. biSize : 0x00000028 = 40 (Bitmap Info Header 的長度)
2. biWidth : 0x00000030 = 48 (圖檔寬度為 48 pixel)
3. biHeight : 0x00000080 = 128 (圖檔高度為 128 pixel)
4. biPlanes : 0x01 = 1 (位元圖層數為1)
5. biBitCount : 0x01 = 1 (單色點陣圖 ,使用黑白2 色調色盤 )
【註3】每個像素的位元數 1:單色點陣圖(使用 2 色調色盤)
4:4 位元點陣圖(使用 16 色調色盤)
8:8 位元點陣圖(使用 256 色調色盤)
16:16 位元高彩點陣圖(不一定使用調色盤)
24:24 位元全彩點陣圖(不使用調色盤)
32:32 位元全彩點陣圖(不一定使用調色盤)
6. biCompression : 0x0 (0:未壓縮)
7. biSizeImage : 0x00000400 =1024 (點陣圖的資料大小為1024 bytes)
8. biXPelsPerMeter : 0x00000b12 =2834 (4 bytes,水平解析度)
9. biYPelsPerMeter : 0x00000b12 =2834 (4 bytes,垂直解析度)
10. biClrUsed : 0x0 (點陣圖使用的調色盤顏色數)
11. biClrImportant : 0x0 (重要的顏色數)
【Image Raw Data 】
BMP在儲存影像時,資料記錄及讀取都是由圖片的左下到右上,另外紀錄圖形各列的資訊
如果不是 4-byte(一般,遵守 long boundary 規則) 或 2-byte(有壓縮的 BMP,遵守 word boundary
規則) 的倍數需補零(figure 2)直到符合規則,在讀檔時當然也要記得略過這些多餘的部分。
1-bit Bitmap
色、 0 表示黑色),所以讀取 1-bit Bitmap 時必須注意是否具有色表。另外比較特別的就是,它
將 8 個像素的資料集中在一個 byte 內, 所以抓取每個 byte 後都必須分析當中的資料,這是 1-
bit Bitmap 比較麻煩的地方。
沒有留言:
張貼留言