借鉴 GDI+ 使用 StretchDIBits 进行缩放的图形对象位图

发布于 2024-07-23 03:56:51 字数 584 浏览 13 评论 0原文

我正在使用 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 缩放位图并最终在图形对象上绘制。

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

I am drawing bitmap images on graphics object using DrawImage method But the Images are in large number so it is taking too much time for Drawing. I have read in this forum that using StretchDIBits takes less time for Drawing.
I am scaling the image by calling Drawimage but i want any other efficent method.
I have a Vector of Bitmap* & i want to draw each Bitmap on graphics.

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

m_vImgFrames is image vector containg Bitmap*. I have taken HBITMAP from Bitmap*.

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

Using this HBITMAP i want to draw on orghDC & finally on graphics. So I want to know how StretchDIBits can be used for scaling the Bitmap and finally draw on Graphics Object.

I am new to this forum.Any ideas or code can be helpful

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

烦人精 2024-07-30 03:56:51

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

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

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

Instead of using StretchDIBits, why not use the GDI+ API directly to scale the bitmap?:

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

graphics.DrawImage( (Image*)m_vImgFrames[0], 
    rc.left, rc.top, rc.Width(), rc.Height() );
jJeQQOZ5 2024-07-30 03:56:51

要将 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 快多少代码>.

To use StretchDIBits with Gdiplus::Bitmap you could do the following:

// 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 );

But this doesn't looks much faster on my machine than simple Graphics::DrawImage.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文