2014年1月14日 星期二

[筆記] bmp 檔案說明

BMP圖檔的格式,在「點陣圖 (Bitmap) 檔案格式」一文中有詳細的介紹。
這次使用到的 是"單色點陣圖(使用 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 */    

【File Header範例】
    
 1.  bfType  :     0x4D42   ’’M‘ (0x4D) 、B‘ (0×42)
 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 

1-bit Bitmap (biBitCount=1),是屬於單色模式的影像,色表可有可無 (當沒有色表時 1 表示白
色、 0 表示黑色),所以讀取 1-bit Bitmap 時必須注意是否具有色表。另外比較特別的就是,它
將 8 個像素的資料集中在一個 byte 內, 所以抓取每個 byte 後都必須分析當中的資料,這是 1-
bit Bitmap 比較麻煩的地方。




沒有留言:

張貼留言