BMP 檔案由 3~4 區塊組成 (視是否有調色板/遮罩):
typedef struct tagBITMAPFILEHEADER {
WORD bfType; // 0x4D42 ('BM')
DWORD bfSize; // 檔案總位元組數
WORD bfReserved1; // 保留 0
WORD bfReserved2; // 保留 0
DWORD bfOffBits; // 像素資料相對檔案開頭位移
} BITMAPFILEHEADER;
bfType 必為 'BM' (0x4D42) 識別 BMPbfOffBits 關鍵:直接定位像素資料起始位置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;
biBitCount <= 8:索引色,**必有**調色板 (RGBQUAD 陣列,大小 biClrUsed 或 1<) biBitCount = 16/32 且 biCompression == BI_BITFIELDS:緊接著 3 個 DWORD 遮罩 (R/G/B 位元遮罩)biCompression == BI_RGB (無壓縮) 且高位元深度:無調色板/遮罩,直接 RGB 排列rowSize = ((width * bitCount + 31) / 32) * 4BITMAPFILEHEADER,驗證 bfType,取得 bfOffBitsBITMAPINFOHEADER (依 biSize 判斷版本)bfOffBits,逐列讀取像素 (注意行對齊補齊)biHeight > 0,垂直翻轉或從尾部反向讀取