標準 BMP 檔案由三部分組成:
BITMAPFILEHEADER):識別標誌 "BM"、檔案大小、資料偏移量。BITMAPINFO):包含資訊頭(BITMAPINFOHEADER,寬高、位深、壓縮格式等)與調色盤(RGBQUAD 陣列,僅 8-bit 以下需用)。// 檔案頭
typedef struct { WORD bfType; DWORD bfSize; WORD bfReserved1, bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER;
// 資訊頭
typedef struct { DWORD biSize; LONG biWidth, biHeight; WORD biPlanes, biBitCount; DWORD biCompression, biSizeImage; LONG biXPelsPerMeter, biYPelsPerMeter; DWORD biClrUsed, biClrImportant; } BITMAPINFOHEADER;
// 調色盤項目 (BGR 順序)
typedef struct { BYTE rgbBlue, rgbGreen, rgbRed, rgbReserved; } RGBQUAD;
biBitCount 決定像素格式:1(單色)、4(16色)、8(256色)、16(高彩色)、24(真彩色)、32(含 Alpha)。
封裝讀寫、顯示、記憶體管理、調色盤處理等功能:
new 配置記憶體,後者呼叫 CreateDIBSection 讓系統管理像素緩衝區(效能較佳)。StretchDIBits 繪製,支援來源/目標矩形縮放。注意:DIB 像素自下而上儲存,座標計算需留意。ComputePaletteSize 計算大小,SetWinPalette 建立系統調色盤,顯示前以 SelectPalette 實現。DWORD dwBytes = ((DWORD)biWidth * biBitCount) / 32;
if (((DWORD)biWidth * biBitCount) % 32) dwBytes++;
dwBytes *= 4;
m_dwImageSize = dwBytes * biHeight;
CFG_DIB dib;
dib.NewFile(640, 480, 24); // 建立新圖
CFile file; file.Open(path, CFile::modeRead);
dib.ReadFile(&file); file.Close(); // 讀取現有檔
dib.m_Dest = CPoint(0,0);
dib.m_DestSize = CSize(dib.GetWidth(), dib.GetHeight());
dib.m_Src = CPoint(0,0);
dib.m_SrcSize = dib.m_DestSize;
dib.Display(GetDC()); // 繪製至螢幕
dib.CloseFile();
原始碼附帶完整錯誤處理與資源釋放,適合直接整合至專案中。