StretchBlt:從源矩形中復制一個位圖到目標矩形,必要時按目標設備設置的模式進行圖像的拉伸或壓縮,如果目標設備是窗口DC,則意味著在窗口繪制位圖,大致的使用代碼如下:
DrawImage(HDC hdc, HBITMAP hbm, HDC hdcMemory = HBITMAP old_bmp =
BITMAP bm = { ::GetObject(hbm, (bm), &
hdc,
target_rect.left,
target_rect.top,
target_rect.right - target_rect.left,
target_rect.bottom - target_rect.top,
hdcMemory,
,
,
bm.bmWidth,
bm.bmHeight,
SRCCOPY);
}
StretchDIBits:該函數將DIB(設備無關位圖)中矩形區域內像素使用的顏色數據拷貝到指定的目標矩形中,如果目標設備是窗口DC,同樣意味著在窗口繪制位圖,大致的使用代碼如下:
DrawImage(HDC hdc, LPBITMAPINFOHEADER lpbi, * bits, hdc,
target_rect.left,
target_rect.top,
target_rect.right - target_rect.left,
target_rect.bottom - target_rect.top,
,
,
lpbi->biWidth,
abs(lpbi->biHeight),
bits,
(LPBITMAPINFO)lpbi,
DIB_RGB_COLORS,
SRCCOPY);
}
也就是說StretchDIBits比StretchBlt多消耗了從內存地址空間拷貝圖像數據到GDI地址空間的時間。實際測試結果在XP和Win7系統下兩者效率幾乎沒有區別,所以可以放心大膽的使用StretchDIBits,畢竟內存數據處理起來要方便的多。