如何将序列图像象视频一样播放? 现在有很多序列图像(一秒钟有10-15帧),用什么方式能够把他们象视频一样播放,并且能够停止、暂停、快放(指定每秒播放帧速)、慢放(指定每秒播放帧速)、快进、快退。初步考虑,有两种方案,不知道是否可行。一、使用DirectShow的双缓冲区,但是不知道能否指定每秒播放的帧速。二、考虑将序列图像转成avi格式,然后播放。看看大家还有没有什么更好的方案,或者做过这方面的来谈谈有什么问题要注意。谢谢!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我觉得编写代码用第一种方法比较快,但相对使用内存可能会比较多~可以双缓冲FLIP的时候加上SLEEP之类函数放慢~其实我以前也有想过楼主的问题~~ 阿,没看清你用show?不是吧用draw就行 int canvasFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; result = DirectDrawCreateEx(NULL, (VOID**)&pDD7, IID_IDirectDraw7, NULL); if (result != DD_OK) MessageBox("建立DirectDraw对象失败!"); result = pDD7->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT ); if(result !=DD_OK) MessageBox("设定程序协调层级失败!"); result = pDD7->SetDisplayMode(640,480,16,0,DDSDM_STANDARDVGAMODE); if(result !=DD_OK) MessageBox("设定屏幕显示模式失败!"); memset(&desc,0,sizeof(desc)); desc.dwSize = sizeof(desc); desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; desc.dwBackBufferCount = 1; desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP; result = pDD7->CreateSurface(&desc,&pPSur,NULL); if(result !=DD_OK) MessageBox("建立主绘图页失败!"); caps.dwCaps = DDSCAPS_BACKBUFFER; result = pPSur->GetAttachedSurface(&caps,&pBBuf); if(result !=DD_OK) MessageBox("连接后缓冲区失败!"); memset(&desc,0,sizeof(desc)); desc.dwSize = sizeof(desc); desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ; desc.dwWidth = 640; desc.dwHeight = 480; char file[10]; char num[5]; for(i=0;i<=7;i++) { result = pDD7->CreateSurface(&desc, &pOPla[i], NULL); if(result !=DD_OK) MessageBox("建立幕后暂存区失败!"); ColorKey(i); sprintf( file , "b%d.bmp" , i ); bitmap = (HBITMAP)::LoadImage(NULL,file,IMAGE_BITMAP,640,480,LR_LOADFROMFILE); if(bitmap==NULL) MessageBox("无法载入位图!"); ::SelectObject(hdc,bitmap); pOPla[i]->GetDC( &hdc1 ); ::BitBlt( hdc1 , 0 , 0 , 640 , 480 , hdc , 0 , 0 , SRCCOPY ); sprintf( num , "第 %d 张图" , i ); ::TextOut(hdc1, 0, 0, num, lstrlen(num)); pOPla[i]->ReleaseDC( hdc1 ); } SetTimer(1,500,NULL); i=0; return 0;}void canvasFrame::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { CFrameWnd::OnChar(nChar, nRepCnt, nFlags); if( nChar== VK_ESCAPE ) PostMessage(WM_CLOSE ); }void canvasFrame::OnTimer(UINT nIDEvent) { CFrameWnd::OnTimer(nIDEvent); if(i==7) i=0; pBBuf->BltFast( 0 , 0 , pOPla[7], CRect(0,0,640,480) , DDBLTFAST_WAIT); pBBuf->BltFast( 0 , 0 , pOPla[i], CRect(0,0,640,480) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY ); pPSur->Flip( NULL , DDFLIP_WAIT ); i++;} To zjlgigi(张无忌) :确实是有这个问题,但也只好先放下。To wuliangge2001(还是不懂):谢谢!!是一个很好的方案,我先试试,在来回复!现在还有一个很烦的问题是,我要同时播放三路图像。正在想有什么好的方案。 API 运行流程 难道VS2010编写出来文件都要.NET包?? 关于打印机的问题,我安装了三个网络打印机,应该如何取出列表,选择性的使用不同打印机 用剪贴板进行通信的疑问 写文件操作? 关于多线程处理上百或者上千终端同事连接一个服务器的问题(急) 100分求教!关于DLL的问题 CFileException::generic 错误 是怎么产生的? 如何解决? ?????--??? To Visual C++ 谁能告诉我? 刚刚上传了一个自己写的软件,欢迎大家下载测试,提供宝贵意见 如何在VC++.NET中的IDL文件中加入enum, struct?
可以双缓冲FLIP的时候加上SLEEP之类函数放慢~其实我以前也有想过楼主的问题~~
你用show?
不是吧
用draw就行
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
result = DirectDrawCreateEx(NULL, (VOID**)&pDD7, IID_IDirectDraw7, NULL); if (result != DD_OK)
MessageBox("建立DirectDraw对象失败!");
result = pDD7->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE |
DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT ); if(result !=DD_OK)
MessageBox("设定程序协调层级失败!");
result = pDD7->SetDisplayMode(640,480,16,0,DDSDM_STANDARDVGAMODE); if(result !=DD_OK)
MessageBox("设定屏幕显示模式失败!");
memset(&desc,0,sizeof(desc));
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
desc.dwBackBufferCount = 1;
desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
result = pDD7->CreateSurface(&desc,&pPSur,NULL); if(result !=DD_OK)
MessageBox("建立主绘图页失败!");
caps.dwCaps = DDSCAPS_BACKBUFFER;
result = pPSur->GetAttachedSurface(&caps,&pBBuf); if(result !=DD_OK)
MessageBox("连接后缓冲区失败!");
memset(&desc,0,sizeof(desc));
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
desc.dwWidth = 640;
desc.dwHeight = 480;
char file[10];
char num[5];
for(i=0;i<=7;i++)
{
result = pDD7->CreateSurface(&desc, &pOPla[i], NULL);
if(result !=DD_OK)
MessageBox("建立幕后暂存区失败!");
ColorKey(i);
sprintf( file , "b%d.bmp" , i );
bitmap = (HBITMAP)::LoadImage(NULL,file,IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
if(bitmap==NULL)
MessageBox("无法载入位图!");
::SelectObject(hdc,bitmap);
pOPla[i]->GetDC( &hdc1 );
::BitBlt( hdc1 , 0 , 0 , 640 , 480 , hdc , 0 , 0 , SRCCOPY );
sprintf( num , "第 %d 张图" , i );
::TextOut(hdc1, 0, 0, num, lstrlen(num));
pOPla[i]->ReleaseDC( hdc1 );
}
SetTimer(1,500,NULL);
i=0;
return 0;
}void canvasFrame::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CFrameWnd::OnChar(nChar, nRepCnt, nFlags);
if( nChar== VK_ESCAPE )
PostMessage(WM_CLOSE );
}void canvasFrame::OnTimer(UINT nIDEvent)
{
CFrameWnd::OnTimer(nIDEvent);
if(i==7)
i=0;
pBBuf->BltFast( 0 , 0 , pOPla[7], CRect(0,0,640,480) , DDBLTFAST_WAIT);
pBBuf->BltFast( 0 , 0 , pOPla[i], CRect(0,0,640,480) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY ); pPSur->Flip( NULL , DDFLIP_WAIT );
i++;
}
To wuliangge2001(还是不懂):谢谢!!是一个很好的方案,我先试试,在来回复!现在还有一个很烦的问题是,我要同时播放三路图像。正在想有什么好的方案。