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,畢竟內存數據處理起來要方便的多。