图像显示速度慢的问题!解决另加一百!!!在线结帐!

guanbenben 2007-12-18 10:32:59
1。我先从USB中接收图像数据,每接收够512字节,就调用setpixel将这一行打印到显示器上,直到将图像数据完全显示在屏幕上
2。然后从USB中接收字符数据(最终的图由前面的图像数据和字符数据叠加形成),也是每接收够一行就用setpixel显示,直到将全部字符数据也显示到屏幕上
3.效果:在屏幕上先一行一行向下刷出图像部分,然后在一行一行刷出数据部分,覆盖在上面,组成一幅图

问题:这种方法显示速度太慢了,要20多秒!!!

请问有没有别的方法让图像可以速度一点显示在屏幕上?

...全文
699 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
tzyu65 2007-12-21
  • 打赏
  • 举报
回复
如果单纯接收都要13秒的话,无论怎么优化都不会少于13秒的。也就是说,BitBlt或者双缓冲最多也就帮你从20秒减到13秒。你是什么应用,这个可以接受吗?
死机的话,看看堆栈,Debug一下,到底是什么不对。“一运行程序就死机”,信息不足,没人能帮得上你。
a0002 2007-12-19
  • 打赏
  • 举报
回复
要保证显示图像速度快、不闪烁,总的原则:

1、一条语句完成整个图像刷新(一个函数调用);

手段:

2、双缓冲区、内存作图。

以上两条,百试不爽!

guanbenben 2007-12-19
  • 打赏
  • 举报
回复
双缓冲是我看了bobob早期的一篇文章写的:http://topic.csdn.net/t/20051229/14/4488638.html

1.在读图像数据的线程里建一个内存兼容DC
2.创建一个内存兼容bitmap
3.关联创建的内存兼容dc和bitmap
4.每读一行数据,就用setpixel写到内存DC上
5.将内存DCbitblt到屏幕上

不知这么写有没有问题?



jameshooo 2007-12-19
  • 打赏
  • 举报
回复
自己注意控制内存越界
guanbenben 2007-12-19
  • 打赏
  • 举报
回复
上首页了?

跟了一下是内存越界

可能还是双缓冲写的有问题

guanbenben 2007-12-19
  • 打赏
  • 举报
回复
TO STARS0913:

我在接收时不加判断也用了13S之多,问题不是出在这里吧

关键是我的双缓冲写的有问题,一运行程序就死机。。。
stars0913 2007-12-19
  • 打赏
  • 举报
回复
好热闹啊,我也来凑合下。
“USB用的是批传输,一次64个字节,图像数据大小为640*480,总的数据量不是很大
640*480

只把数据接收到内存,居然要13S,不知道改用双缓冲速度能提高多少? ”

主要看你数据量多大了 640*480*3(RGB)= 921600(1M不到些)。如果是(565)的那么就是614400。
接受用了13S说明你的接受缓冲写的有问题,也太慢了。一次64字节是没有错,不要加太多判断在里面
LZ如果有条件的话,可以在前端先用硬件压缩一下,再传上来,那样快很多,很多摄像头都是这么做的。
还有就是双缓冲是对的,接受完一帧显示一帧,别用setpixel,太慢了。
guanbenben 2007-12-19
  • 打赏
  • 举报
回复
up
my_girlf 2007-12-18
  • 打赏
  • 举报
回复
如果时间主要是花费在USB发送上,那就应该考虑的是怎么提高USB的发送效率啊。跟显示有多大关系?画的过程不会耗多少时间的。
guanbenben 2007-12-18
  • 打赏
  • 举报
回复
up
buggycode 2007-12-18
  • 打赏
  • 举报
回复
640*480

只把数据接收到内存,居然要13S,不知道改用双缓冲速度能提高多少?

按17楼改先

2 传输时最少每次多传,以页大小(一般为4K)为块进行传输
guanbenben 2007-12-18
  • 打赏
  • 举报
回复
楼上的,关键的是USB那边是先发图像数据,再发的字符数据
lucian2007 2007-12-18
  • 打赏
  • 举报
回复
双缓冲,用两个buffer来接受数据,接受数据和显示刷新同步处理。
superarhow 2007-12-18
  • 打赏
  • 举报
回复
时代不同了,SetPixel也很快的。关键还是接收耗时。
leixuejun 2007-12-18
  • 打赏
  • 举报
回复
unsigned char *m_pDisplayImageData;
m_pDisplayImageData = (unsigned char *)new char[m_nNumRows * m_nNumCols];
m_nNumRows * m_nNumCols为图像大小,
把图像数据放入m_pDisplayImageData中,再调用
displayImage(m_pDisplayImageData);

void CVcdemoDlg::displayImage(unsigned char *pImage)
{
CWnd *pDisplayWnd = GetDlgItem(IDC_LIVE_FINGER);
CRect displayRect;

pDisplayWnd->GetClientRect(&displayRect);
CDC *pDC = pDisplayWnd->GetDC();

//display image, keep the image ratio
displayGrayImage(pDC->m_hDC, pImage, 0, 0,
displayRect.Width() * m_nNumCols / m_nNumRows, displayRect.Height(),
m_nNumCols, m_nNumRows);

//release DC
pDisplayWnd->ReleaseDC(pDC);
}

应该是可以快速的显示在picture控件中,曾做过从USB设备获取指纹图像,显示速度感觉还是很快的.如有问题,可加我QQ:6157947
guanbenben 2007-12-18
  • 打赏
  • 举报
回复
4楼的思路不错,但这样速度实质上并没有提高
zhuzhu101011 2007-12-18
  • 打赏
  • 举报
回复
CreateCompatibleDC
guanbenben 2007-12-18
  • 打赏
  • 举报
回复
各位,我很少用到VC的编程,所以最后能有个参考代码!谢谢 分马上送上
iyranly 2007-12-18
  • 打赏
  • 举报
回复
能不能先将图像数据保存在本地临时文件夹下(相当于复制),完成后再让它显示在屏幕上?
复制完一张图显示一张..
jameshooo 2007-12-18
  • 打赏
  • 举报
回复
双缓冲,使用内存DC
加载更多回复(11)

19,468

社区成员

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

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