常規 GDI 顯示 BMP 存在內存佔用大、縮放失真、低色設備顯示高色圖像失真等缺陷。本文詳細解析 BMP 文件結構,並介紹視頻函數(DirectDraw/Video for Windows)顯示優化方案。
typedef struct tagBITMAPFILEHEADER {
WORD bfType; // 必須為 'BM' (0x4D42)
DWORD bfSize; // 文件總大小(字節)
WORD bfReserved1; // 保留,必須為 0
WORD bfReserved2; // 保留,必須為 0
DWORD bfOffBits; // 位圖數據偏移量(相對文件頭)
} BITMAPFILEHEADER;
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_RLE4/BI_BITFIELDS
DWORD biSizeImage; // 圖像數據大小(可為 0 表示 BI_RGB)
LONG biXPelsPerMeter; // 水平分辨率
LONG biYPelsPerMeter; // 垂直分辨率
DWORD biClrUsed; // 實際使用顏色數
DWORD biClrImportant; // 重要顏色數
} BITMAPINFOHEADER;
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved; // 必須為 0
} RGBQUAD;
biBitCount=1,4,8:分別有 2, 16, 256 個表項biBitCount=16/24/32:無顏色表,直接存儲 RGB 值
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1]; // 可變長度數組
} BITMAPINFO;
(原文此處截斷,補充核心思路)
DirectDrawCreate 創建對象SetCooperativeLevel 設置獨佔/全屏模式SetDisplayMode 設置分辨率/色深CreateSurface 創建主 Surface/後備 SurfaceLock) → 複製像素數據 → 解鎖 (Unlock)Flip 或 Blt 顯示| 問題 | GDI 方案 | 視頻函數方案 |
|---|---|---|
| 大圖內存 | 全量載入內存 | 分塊流式處理、顯存直接存儲 |
| 縮放失真 | StretchBlt 軟件算法 | 硬件雙線性/雙三次插值 |
| 低色設備 | 調色板映射失真 | 硬件抖動、直接色模式 |
| 撕裂現象 | 雙緩衝仍有閃爍 | 垂直同步翻頁 |
<ddraw.h>,鏈接 ddraw.libHRESULTDDSURFACEDESC2 設置 ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORYddpfPixelFormat 精確匹配 BMP biBitCount、掩碼IDirectDrawPalette 並 SetPalette深入理解 BMP 文件結構是圖像處理基礎。對於高性能顯示需求,視頻函數(DirectDraw/Direct3D/Media Foundation)通過硬件加速、顯存管理、零拷貝機制,徹底解決 GDI 的性能與質量瓶頸。現代開發建議直接使用 Direct2D/Direct3D 11+ 或 Media Foundation 替代已棄用的 DirectDraw。