StrechDIBits() 如何提高绘图速度

qq_22509263 2017-11-28 01:18:14
求教大神,本人使用MFC自己写了一个picture控件,使用GDI的 StrechDIBits()函数绘图,在画大图时速度很慢,3亿像素的8位bmp图,画一次要2000 -2400毫秒也就是2秒以上了。

但是用公司的库绘图只要6-20毫秒就能完成,我想问问有什么解决办法吗,是我的问题还是函数本身的问题,或者有什么优化的方法吗。

SYSTEMTIME TimeStart, TimeEnd;
GetLocalTime(×tart);//起始时间
StretchDIBits(pDC->GetSafeHdc(), 0, 0, rcRect.Width(), rcRect.Height(),
dImageXStartPos, dImageYStartPos,
(int)(GetBitMapInfoHeader().biWidth / m_dZoomWidth), (int)(GetBitMapInfoHeader().biHeight /
m_dZoomHeight),
m_pcBufImage, (BITMAPINFO*)m_pBitmapInfo_8, DIB_RGB_COLORS, SRCCOPY);
GetLocalTime(&TimeEnd);//结束时间
float fDetaTime = TimeEnd.wMilliseconds - TimeStart.wMilliseconds + 1000 * (TimeEnd.wSecond - TimeStart.wSecond);
...全文
573 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_22509263 2017-12-06
  • 打赏
  • 举报
回复
谢谢大家,总结一下,想快又想不失真那么估计wingdi还是略差,可以试试其他比如dx,OpenGL
qq_22509263 2017-12-06
  • 打赏
  • 举报
回复
我已经解决了,确实halftone耗时严重,用了内存DC+StretchDIBits可以防止屏幕闪烁,但StretchDIBits速度一样慢的。我改用了STRETCH_DELETESCANS速度和公司库一样快了,但3亿大图缩小后有些失真,但是看了公司的库,同样失真,公司库比STRETCH_DELETESCANS缩小时的效果略好而已,只是略好,用的方法估计也是缩小直接是按比例抽取像素,并非差值。 我做的是鼠标拖动图片,放大,缩小,小图片无所谓,大图像很慢,找不明白原因。其实StretchDIBits这个函数本身HALFTONE模式确实很慢,但是效果还是很好的。如果想做的效果更好,估计需要换一种工具了。
谁帮我内推 2017-11-30
  • 打赏
  • 举报
回复
这个api我以前用过,确实很耗时,建议你找找有没有好点的第三方库
hhhh63 2017-11-29
  • 打赏
  • 举报
回复
改D2D吧,我最近也在用,C:\Program Files (x86)\Microsoft Visual Studio 10.0\Samples\2052\VC2010SP1Samples.zip中有好多例子
qsjming 2017-11-29
  • 打赏
  • 举报
回复
类似与双缓冲的机制,用一个内存DC保存图片,DC到DC之间的操作很快。
qq_22509263 2017-11-29
  • 打赏
  • 举报
回复
2楼兄弟能不能回复的具体点
赵4老师 2017-11-28
  • 打赏
  • 举报
回复
改用DX ?
sevancheng 2017-11-28
  • 打赏
  • 举报
回复
在内存DC绘,再拷贝
汪宁宇 2017-11-28
  • 打赏
  • 举报
回复
把StretchDIBits第一个参数换成内存DC,另外最好操作像素的时候直接在内存位图中操作即可,转成DIB格式,直接给memcpy修改像素点

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧