2009-06-07 169 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