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

BMP 位圖檔案格式深度解析:檔案頭、資訊頭、調色盤、像素資料結構完整說明

     編輯:關於C語言

BMP 檔案四大區塊

  1. 檔案頭 (BITMAPFILEHEADER, 14 位元組)
  2. 資訊頭 (BITMAPINFOHEADER 等, 40+ 位元組)
  3. 調色盤 (RGBQUAD 陣列, 可選)
  4. 像素資料 (原始位元組陣列)

1. 檔案頭 BITMAPFILEHEADER


typedef struct tagBITMAPFILEHEADER {
    WORD  bfType;      // 必須為 'BM' (0x4D42)
    DWORD bfSize;      // 檔案總大小 (位元組)
    WORD  bfReserved1; // 保留,必須 0
    WORD  bfReserved2; // 保留,必須 0
    DWORD bfOffBits;   // 像素資料相對檔案開頭位移
} BITMAPFILEHEADER; // 14 bytes, 2-byte alignment

2. 資訊頭 BITMAPINFOHEADER (最常用, 40 位元組)


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(1), BI_RLE4(2), BI_BITFIELDS(3), BI_JPEG(4), BI_PNG(5)
    DWORD biSizeImage;     // 像素資料大小 (可為 0 表示 BI_RGB 未壓縮)
    LONG  biXPelsPerMeter; // 水平解析度 (像素/米)
    LONG  biYPelsPerMeter; // 垂直解析度
    DWORD biClrUsed;       // 實際使用調色盤顏色數 (0=全部)
    DWORD biClrImportant;  // 重要顏色數 (0=全部)
} BITMAPINFOHEADER;

其他版本:BITMAPV4HEADER (108 bytes, 加入色域/Gamma/Alpha 遮罩)、BITMAPV5HEADER (124 bytes, 加入 ICC 設定檔)。

3. 調色盤 RGBQUAD


typedef struct tagRGBQUAD {
    BYTE rgbBlue;
    BYTE rgbGreen;
    BYTE rgbRed;
    BYTE rgbReserved; // 必須 0
} RGBQUAD; // 4 bytes
  • 顏色數由 biBitCount 決定:1-bit→2色, 4-bit→16色, 8-bit→256色, 16/24/32-bit→無調色盤 (直接 RGB 值)。
  • biClrUsed 可指定實際使用色數 (2^biBitCount 以下)。

4. 像素資料儲存規則

  • 掃描列順序: 預設**底向上** (最後一行在檔案最前),biHeight 為正。biHeight 為負表示頂向下 (DIB 區段常用)。
  • 列對齊: **每掃描列必須 4 位元組對齊** (DWORD aligned)。
    計算:rowSize = ((biWidth * biBitCount + 31) / 32) * 4。
  • 像素格式:
    • 24-bit: BGR 順序 (藍綠紅),每像素 3 位元組。
    • 32-bit: BGRA (含 Alpha),或 BGRx (保留位)。
    • 16-bit: 依 biCompression 為 BI_BITFIELDS 時,緊接資訊頭後有 3 個 DWORD 遮罩 (紅/綠/藍),常見 5-6-5 或 5-5-5 格式。
    • 8/4/1-bit: 索引值,查調色盤取得 RGB。

完整檔案大小驗證


bfSize == bfOffBits + biSizeImage (或計算值: |biHeight| * rowSize)
bfOffBits == sizeof(BITMAPFILEHEADER) + biSize + (biClrUsed ? biClrUsed*4 : (biBitCount<=8 ? (1<

MFC/C++ 讀寫關鍵點

  • 使用 #pragma pack(push, 2) 確保結構對齊 (檔案頭 2-byte alignment)。
  • 讀取時驗證 bfType == 'MB' (小端序讀取為 0x4D42)。
  • 支援 BI_BITFIELDS 解析 16/32-bit 遮罩。
  • 寫入時正確計算 rowSize 對齊補齊。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved