【问题标题】:Drawing On GDI+ Graphics Object a Bitmap using StretchDIBits for Scaling使用 StretchDIBits 在 GDI+ 图形对象上绘制位图以进行缩放
【发布时间】:2009-06-07 10:45:04
【问题描述】:

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

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 来缩放 Bitmap 并最终在 Graphics Object 上绘制。

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

【问题讨论】:

    标签: c++ gdi+ stretchdibits


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。我已经尝试过使用 DrawImage,但速度很慢。我找到了使用 StretchDIBits 的方法,并且性能非常好。
    • 我打算评论你的问题,但 VideoDev 打败了我。您不想使用 DrawImage,因为它非常慢。
    【解决方案2】:

    要将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 );
    

    但这在我的机器上看起来并不比简单的Graphics::DrawImage快多少。

    【讨论】:

      猜你喜欢
      • 2010-11-16
      • 1970-01-01
      • 2017-05-28
      • 2011-11-08
      • 1970-01-01
      • 2019-08-12
      • 2011-11-04
      • 2022-08-17
      • 1970-01-01
      相关资源
      最近更新 更多