首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

BMP 檔案格式結構深度解析:檔案頭、資訊頭、調色板與像素資料

     編輯:關於C++

BMP 檔案整體架構

BMP 檔案由 3~4 區塊組成 (視是否有調色板/遮罩):

  1. 檔案頭 (BITMAPFILEHEADER, 14 bytes)
  2. 資訊頭 (BITMAPINFOHEADER 等, 40+ bytes)
  3. 調色板 (可選,索引色模式需求)
  4. 像素資料 (掃描列由下而上、每列 4-byte 對齊)

1. 檔案頭 (BITMAPFILEHEADER)

typedef struct tagBITMAPFILEHEADER {
    WORD  bfType;      // 0x4D42 ('BM')
    DWORD bfSize;      // 檔案總位元組數
    WORD  bfReserved1; // 保留 0
    WORD  bfReserved2; // 保留 0
    DWORD bfOffBits;   // 像素資料相對檔案開頭位移
} BITMAPFILEHEADER;
  • bfType 必為 'BM' (0x4D42) 識別 BMP
  • bfOffBits 關鍵:直接定位像素資料起始位置

2. 資訊頭 (BITMAPINFOHEADER - 最常見)

typedef struct tagBITMAPINFOHEADER {
    DWORD biSize;          // 結構大小 (40)
    LONG  biWidth;         // 寬度 (像素)
    LONG  biHeight;        // 高度 (正值=底部優先/從下而上, 負值=頂部優先)
    WORD  biPlanes;        // 色彩平面數 (固定 1)
    WORD  biBitCount;      // 每像素位元數 (1,4,8,16,24,32)
    DWORD biCompression;   // 壓縮類型 (BI_RGB=0 無壓縮, BI_RLE8, BI_BITFIELDS 等)
    DWORD biSizeImage;     // 像素資料大小 (可為 0 表示 BI_RGB)
    LONG  biXPelsPerMeter; // 水平解析度
    LONG  biYPelsPerMeter; // 垂直解析度
    DWORD biClrUsed;       // 實際使用調色盤索引數 (0=全部)
    DWORD biClrImportant;  // 重要色彩數 (0=全部)
} BITMAPINFOHEADER;

3. 調色板 / 色彩遮罩

  • biBitCount <= 8:索引色,**必有**調色板 (RGBQUAD 陣列,大小 biClrUsed 或 1<)
  • biBitCount = 16/32 且 biCompression == BI_BITFIELDS:緊接著 3 個 DWORD 遮罩 (R/G/B 位元遮罩)
  • biCompression == BI_RGB (無壓縮) 且高位元深度:無調色板/遮罩,直接 RGB 排列

4. 像素資料儲存規則

  • 掃描列順序:從下而上 (biHeight > 0),即最後一列在檔案最前
  • 每列 **4-byte 對齊**:rowSize = ((width * bitCount + 31) / 32) * 4
  • 24-bit:每像素 3 bytes (BGR 順序)
  • 32-bit:每像素 4 bytes (通常 BGRA 或 BGRX)
  • 16-bit:每像素 2 bytes (依遮罩或預設 5-5-5/5-6-5)

解析 BMP 關鍵步驟

  1. 讀取 BITMAPFILEHEADER,驗證 bfType,取得 bfOffBits
  2. 讀取 BITMAPINFOHEADER (依 biSize 判斷版本)
  3. 若有調色板/遮罩,讀取對應資料
  4. Seek 至 bfOffBits,逐列讀取像素 (注意行對齊補齊)
  5. 若 biHeight > 0,垂直翻轉或從尾部反向讀取

參考資源

  • CSDN jurrah 詳細解析
  • CNBlogs beer 深度剖析
  • BlogJava georgehill 實作筆記
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved