StretchDIBits 看起来很慢,有没有更快的 API?
我想在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
速度差异来自于除了处理拉伸所需的通用性之外进行任何必要的颜色转换(即使您的目标尺寸与源尺寸相同)。
如果您只绘制一次图像,那么我认为您正在寻找的函数是
SetDIBitsToDevice
。如果您因为多次绘制相同的 DIB 而关心速度,那么您可以通过将 DIB 复制到兼容的内存 DC 一次,然后从内存 DC 进行
BitBlt
-ing 来提高性能。每次需要时都可以使用屏幕(或打印机)。 使用CreateCompatibleDC
创建内存DC,然后使用StretchDIBits
或SetDIBitsToDevice
获取其上的图像。 之后,您可以直接使用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. UseCreateCompatibleDC
to create the memory DC, and then useStretchDIBits
orSetDIBitsToDevice
to get the image on it. After that, you can useBitBlt
directly. You might also look into using aDIBSECTION
, which gives a compromise in performance between a true DIB and a compatible DC.