2009-06-07 48 views
1

我使用DrawImage方法在圖形對象上繪製位圖圖像但圖像數量很大,因此繪製需要花費太多時間。我已經在這個論壇讀到使用StretchDIBits花費較少的時間進行繪圖。 我通過調用Drawimage縮放圖像,但我想要任何其他有效的方法。我有一個位圖矢量* &我想在圖形上繪製每個位圖。在GDI +圖形對象上使用StretchDIBits繪製位圖使用StretchDIBits進行縮放

HDC orghDC = graphics.GetHDC(); 
CDC *dc = CDC::FromHandle(orghDC); 

m_vImgFrames是方含Bitmap*圖像載體。我已經從Bitmap*採取了HBITMAP。

HBITMAP hBitmap; 
m_vImgFrames[0]->GetHBITMAP(Color(255,0,0),&hBitmap); 

使用這個HBITMAP我想最終在圖形上繪製orghDC &。所以我想知道StretchDIBits如何用於縮放位圖並最終繪製圖形對象。

我是新來這個forum.Any想法或代碼可以幫助

回答

1

而不是使用的StretchDIBits的,爲什麼不使用GDI + API直接縮放位圖?:

CRect rc(0, 0, 20, 30); 

graphics.DrawImage((Image*)m_vImgFrames[0], 
    rc.left, rc.top, rc.Width(), rc.Height()); 
+0

感謝您的答覆。我已經嘗試過使用DrawImage,但速度非常慢。我已經找到了如何使用StretchDIBits的方法,並且我獲得了非常好的性能。 – VideoDev 2009-07-10 10:18:11

0

要使用StretchDIBitsGdiplus::Bitmap你可以做到以下幾點:

// get HBITMAP 
HBITMAP hBitmap; 
m_vImgFrames[0]->GetHBITMAP(Gdiplus::Color(), &hBitmap); 
// get bits and additional info 
BITMAP bmp = {}; 
::GetObject(hBitmap, sizeof(bmp), &bmp); 
// prepare BITMAPINFO 
BITMAPINFO bminfo = {}; 
bminfo.bmiHeader.biSize = sizeof(BITMAPINFO); 
bminfo.bmiHeader.biWidth = bmp.bmWidth; 
bminfo.bmiHeader.biHeight = bmp.bmHeight; 
bminfo.bmiHeader.biBitCount = bmp.bmBitsPixel; 
bminfo.bmiHeader.biCompression = BI_RGB; 
bminfo.bmiHeader.biPlanes = bmp.bmPlanes; 
bminfo.bmiHeader.biSizeImage = bmp.bmWidthBytes*bmp.bmHeight*4; // 4 stands for 32bpp 
// select stretch mode 
::SetStretchBltMode(HALFTONE); 
// draw 
::StretchDIBits(hDC, 0, 0, new_cx, new_cy, 0, 0, 
    m_vImgFrames[0]->GetWidth(), m_vImgFrames[0]->GetHeight(), 
    bmp.bmBits, &bminfo, DIB_RGB_COLORS, SRCCOPY); 

但這並不看起來更快我的機器上簡單Graphics::DrawImage