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

BMP 位圖檔案結構解析與通用讀寫類 CFG_DIB

     編輯:關於VC++

位圖檔案三層結構

標準 BMP 檔案由三部分組成:

  1. 檔案頭(BITMAPFILEHEADER):識別標誌 "BM"、檔案大小、資料偏移量。
  2. 資訊區塊(BITMAPINFO):包含資訊頭(BITMAPINFOHEADER,寬高、位深、壓縮格式等)與調色盤(RGBQUAD 陣列,僅 8-bit 以下需用)。
  3. 像素資料:依位深排列,每列位元組數必為 4 的倍數(不足補 0)。

關鍵結構體說明

// 檔案頭
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)。

CFG_DIB 類別設計

封裝讀寫、顯示、記憶體管理、調色盤處理等功能:

  • ReadFile / ReadSection:前者用 new 配置記憶體,後者呼叫 CreateDIBSection 讓系統管理像素緩衝區(效能較佳)。
  • WriteFile:依序寫入檔案頭、資訊頭、調色盤、像素資料。
  • Display:呼叫 StretchDIBits 繪製,支援來源/目標矩形縮放。注意:DIB 像素自下而上儲存,座標計算需留意。
  • 調色盤處理:ComputePaletteSize 計算大小,SetWinPalette 建立系統調色盤,顯示前以 SelectPalette 實現。

像素緩衝區大小計算(4 位元組對齊)

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();

原始碼附帶完整錯誤處理與資源釋放,適合直接整合至專案中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved