StretchDIBits 看起来很慢,有没有更快的 API?

发布于 2024-07-20 04:34:51 字数 557 浏览 7 评论 0原文

我想在 HDC 上绘制一个相同大小的 dib。 我在用 : des 和 src 大小相同。

   ::StretchDIBits(hdc,
                des.left,des.top,des.right - des.left,des.bottom - des.top,
                src.left, GetHeight() - src.bottom, src.right - src.left,src.bottom - src.top,
                m_pImg->accessPixels(),m_pImg->getInfo(), DIB_RGB_COLORS, SRCCOPY);

但我发现它很慢,因为des大小是相同的,我只需要将dib复制到dc上。 有没有比 StretchDIBits 更快的方法?

就像

StretchBlt (slow)  vs  Bitblt.(faster)
StretchDIBits (slow ) vs ?(faster)

I want to draw a dib on to a HDC, the same size.
I am using :
des and src are of the same size.

   ::StretchDIBits(hdc,
                des.left,des.top,des.right - des.left,des.bottom - des.top,
                src.left, GetHeight() - src.bottom, src.right - src.left,src.bottom - src.top,
                m_pImg->accessPixels(),m_pImg->getInfo(), DIB_RGB_COLORS, SRCCOPY);

but I find it is slow, because the des size is the same, I just need to copy the dib onto a dc.
Is there any method faster than StretchDIBits?

just as

StretchBlt (slow)  vs  Bitblt.(faster)
StretchDIBits (slow ) vs ?(faster)

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

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

发布评论

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

评论(1

笛声青案梦长安 2024-07-27 04:34:51

速度差异来自于除了处理拉伸所需的通用性之外进行任何必要的颜色转换(即使您的目标尺寸与源尺寸相同)。

如果您只绘制一次图像,那么我认为您正在寻找的函数是SetDIBitsToDevice

如果您因为多次绘制相同的 DIB 而关心速度,那么您可以通过将 DIB 复制到兼容的内存 DC 一次,然后从内存 DC 进行 BitBlt-ing 来提高性能。每次需要时都可以使用屏幕(或打印机)。 使用CreateCompatibleDC创建内存DC,然后使用StretchDIBitsSetDIBitsToDevice获取其上的图像。 之后,您可以直接使用BitBlt。 您还可以考虑使用DIBSECTION,它在真正的 DIB 和兼容的 DC 之间进行性能折衷。

The speed difference comes from doing any necessary color conversion in addition to the generality necessary to handle the stretching (even if your target size is the same as your source size).

If you're just drawing the image just once, then I think function you're looking for is SetDIBitsToDevice.

If you care about the speed because you're drawing the same DIB multiple times, then you can improve performance by copying the DIB to a compatible memory DC once, and then BitBlt-ing from the memory DC to the screen (or printer) each time you need it. Use CreateCompatibleDC to create the memory DC, and then use StretchDIBits or SetDIBitsToDevice to get the image on it. After that, you can use BitBlt directly. You might also look into using a DIBSECTION, which gives a compromise in performance between a true DIB and a compatible DC.

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