1

DrawImage メソッドを使用してグラフィックス オブジェクトにビットマップ イメージを描画していますが、イメージが大量にあるため、描画に時間がかかりすぎています。このフォーラムで、StretchDIBits を使用すると描画にかかる時間が短縮されることを読みました。Drawimage を呼び出して画像をスケーリングしていますが、他の効率的な方法が必要です。Bitmap* の Vector があり、各 Bitmap をグラフィックスに描画したいと考えています。

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

m_vImgFrames は を含む画像ベクトルですBitmap*。から HBITMAP を取得しましたBitmap*

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

この HBITMAP を使用して、orghDC と最終的にグラフィックスに描画したいと考えています。したがって、StretchDIBits を使用して Bitmap をスケーリングし、最終的に Graphics Object を描画する方法を知りたいです。

私はこのフォーラムを初めて利用します。アイデアやコードは役に立ちます

4

2 に答える 2

1

StretchDIBits を使用する代わりに、GDI+ API を直接使用してビットマップをスケーリングしてみませんか?:

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

で使用StretchDIBitsするGdiplus::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 に答える