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

StretchBlt vs StretchDIBits:GDI 圖像拉伸繪制性能與用法對比

     編輯:C++ 入門

Windows GDI 提供兩種拉伸繪制位圖的 API,本文對比其原理、代碼模式與實測性能。

StretchBlt

  • 源:設備相關位圖 (DDB),需先 SelectObject 進內存 DC;
  • 調用:StretchBlt(hdcDst, x, y, w, h, hdcSrc, 0, 0, bmW, bmH, SRCCOPY);
  • 全程在 GDI 設備空間操作。

StretchDIBits

  • 源:設備無關位圖 (DIB),直接用內存緩衝區指針;
  • 調用:StretchDIBits(hdcDst, x, y, w, h, 0, 0, bmW, bmH, pBits, lpBMI, DIB_RGB_COLORS, SRCCOPY);
  • 需額外從用戶模式內存拷貝像素數據到 GDI 空間。

實測結論

  • XP / Win7 下性能幾乎無差異(驅動層可能優化了 DIB 路徑);
  • 推薦 StretchDIBits:內存數據處理靈活(無需建兼容 DC、SelectObject)、跨設備兼容性更好;
  • 若極度追求性能且數據已在 DDB 中,可用 StretchBlt。

代碼模板

// StretchBlt
HDC hMem = CreateCompatibleDC(hdc);
HBITMAP hOld = (HBITMAP)SelectObject(hMem, hbm);
BITMAP bm; GetObject(hbm, sizeof(bm), &bm);
StretchBlt(hdc, x, y, w, h, hMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
SelectObject(hMem, hOld); DeleteDC(hMem);

// StretchDIBits
StretchDIBits(hdc, x, y, w, h, 0, 0, bmi->biWidth, abs(bmi->biHeight),
              pBits, (BITMAPINFO*)bmi, DIB_RGB_COLORS, SRCCOPY);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved