BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #40697同步于 2010/6/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[求助] VC 里如何快速显示位图

ATV
2010/6/23镜像同步4 回复
从网络传来的大量位图,接受后在MFC上显示,最后看起来就是视频的样子 现在程序瓶颈就卡在这了,用GDI 直接 blit ,CPU占用高 网上有说用视频函数 DrawDibRealize() 和 DrawDibDraw() 会好些,但是我照抄的代码连续显示6、7个位图就异常了,诡异 用什么建议吗?
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
babylike机器人#1 · 2010/6/23
现在内存里把位图画好,再复制到显示设备。-----不知在哪里貌似看到过这句话。
jmpesp机器人#2 · 2010/6/23
真巧,前几天刚刚自己写了个简单的YUV视频播放器,效果还不错,给你贴个自己胡搞的代码吧 int InitBmpInfo() { bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmpinfo.bmiHeader.biBitCount = 24; bmpinfo.bmiHeader.biClrImportant = 0; bmpinfo.bmiHeader.biClrUsed = 0; bmpinfo.bmiHeader.biCompression = 0; bmpinfo.bmiHeader.biHeight = - imginfo.height; bmpinfo.bmiHeader.biWidth = imginfo.width; bmpinfo.bmiHeader.biPlanes = 1; bmpinfo.bmiHeader.biSizeImage = imginfo.width * imginfo.height * 3; bmpinfo.bmiHeader.biXPelsPerMeter = 12; bmpinfo.bmiHeader.biYPelsPerMeter = 12; return 1; } DWORD WINAPI DecoderThreadProc (LPVOID pParam) { Sleep(10); HWND hWnd = (HWND)pParam; HDC hDc = GetDC(hWnd); int frame = imginfo.framestart; int interval = 1000 / imginfo.framerate; if (!imginfo.infile) return 0; ifstream yuvfile(imginfo.infile, ios::in | ios::binary); if (!yuvfile.is_open()) return 0; while (1) { if (frame > imginfo.frameend) { if (playerctrl.loop) frame = imginfo.framestart; else break; } ReadFrame(yuvfile, frame); StretchDIBits(hDc, 0, 0, imginfo.width, imginfo.height, 0, 0, imginfo.width, imginfo.height, playerctrl.canvas, &bmpinfo, DIB_RGB_COLORS, SRCCOPY); frame++; Sleep(interval); } yuvfile.close(); ReleaseDC(hWnd, hDc); return 1; } 时间精确度自然不是很准确 更准确点 可以用多媒体定时器之类的 不过嘛 sleep已经凑凑有余了, 这个比SetTimer定时器好多了 因为定时器消息的优先级很低 还有 最好独立开辟一个线程进行视频显示 还有 你涉及到网络传输 所以缓冲要考虑好
a206206机器人#3 · 2010/6/23
ls犀利哥。。
ATV机器人#4 · 2010/6/23
谢谢,明天试试,对比一下~ 【 在 jmpesp 的大作中提到: 】 : 真巧,前几天刚刚自己写了个简单的YUV视频播放器,效果还不错,给你贴个自己胡搞的代码吧 : [color=#0000FF]int InitBmpInfo() : { : ...................