1

我正在使用 DrawImage 方法在图形对象上绘制位图图像,但是图像数量很大,因此绘图花费了太多时间。我在这个论坛上读到,使用 StretchDIBits 绘制所需的时间更少。我通过调用 Drawimage 来缩放图像,但我想要任何其他有效的方法。我有一个位图矢量* & 我想在图形上绘制每个位图。

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

m_vImgFrames 是包含的图像向量Bitmap*。我已经从Bitmap*.

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

使用这个 HBITMAP 我想在 orghDC 上绘制,最后在图形上绘制。所以我想知道如何使用 StretchDIBits 来缩放位图并最终在图形对象上绘制。

我是这个论坛的新手。任何想法或代码都会有所帮助

4

2 回答 2

1

为什么不直接使用 GDI+ API 来缩放位图,而不是使用 StretchDIBits?:

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

graphics.DrawImage( (Image*)m_vImgFrames[0], 
    rc.left, rc.top, rc.Width(), rc.Height() );
于 2009-07-08T21:38:42.630 回答
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 );

但这在我的机器上看起来并不比 simple 快得多Graphics::DrawImage

于 2010-06-15T15:02:29.643 回答