如何将LPVIDEOHDR-〉lpData中的位图数据显示出来?VFW

jethao 2004-09-01 05:02:31

我用VFW实现,但是这种回调函数应该怎么取得bmp的图像数据,显示在IDC_PIC控件中?

我这个函数写的有点乱,本来想手工构造一个BITMAP结构,但是可能那个数据区指针用的有问题,现在的现象是黑色的图片。

我不想保存bmp格式文件,只要能把这个位图数据放在memDC中,能显示就可以了,该怎么做呢?

LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR pVideoHdr)
{
CBitmap mBitmap; //定义一个位图类
CDC* pDC; //绘图设备
CRect rect, picRect; //矩形区域对象
CWnd *pWnd; //得到图片框的窗口指针
CDC memDC; //兼容DC
HBITMAP bmpDisplay;
BITMAP bmp;

TRACE("Begin to Frame!\r\n");
//HWND hWnd;
//CWnd* pWnd;
//pWnd=GetDlgItem(IDC_VIDEOTWO);
//hWnd=pWnd->GetSafeHwnd();
//获得捕获窗的状态
//capGetStatus(hWndCap, &CapStatus, sizeof(CAPSTATUS));
bmp.bmType = 0;
bmp.bmWidth = 0x140;//CapStatus.uiImageWidth;
bmp.bmHeight = 0xf0;//CapStatus.uiImageHeight;
bmp.bmWidthBytes = 0x3c0;
bmp.bmPlanes = 0x01;
bmp.bmBitsPixel = 0x18;
bmp.bmBits = pVideoHdr->lpData;

bmpDisplay = CreateBitmapIndirect(&bmp);

//CString szFileName;
//CString temp;
//temp.Format("%.2d",i);
//szFileName = "D:\\MyProject\\MyVideo\\MyVideo0" + temp + ".bmp";
//szFileName = "D:\\MyProject\\MyVideo\\MyVideo001.bmp";
pWnd = AfxGetMainWnd();
pWnd= pWnd->GetDlgItem(IDC_PIC); //取得控件句柄
//bmpDisplay = (HBITMAP)LoadImage(NULL, szFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
mBitmap.Attach(bmpDisplay); //装入位图对象
//mBitmap.GetBitmap (&bm); //用位图上的信息 填充BITMAP结构的各个域
//mBitmap.LoadBitmap(bm);

//根据位图的大小改变窗口的大小
pWnd->SetWindowPos(NULL,0,0,bmp.bmWidth,bmp.bmHeight,SWP_NOMOVE);

//在内存中生成一个兼容设备,然后拷贝到屏幕显示
pDC = pWnd->GetDC(); //取得绘图设备
memDC.CreateCompatibleDC(pDC);//生成一个兼容设备
memDC.SelectObject (&mBitmap);//在兼容设备中装载位图
Sleep(250);
//显示
pWnd->GetClientRect(&rect); //得到控件窗口的"视"区域
//pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
//释放申明的资源

pWnd->ReleaseDC(pDC);
DeleteDC(memDC);
mBitmap.Detach();
DeleteObject(mBitmap);

return (LRESULT) TRUE;
}



...全文
452 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
DentistryDoctor 2004-09-06
  • 打赏
  • 举报
回复
LPVIDEOHDR pVideoHdr的帧格式?转换为RGB格式,用CreateDIBSection/SetDIBits,构造一个HBITMAP,这样memDC就可以SelectObject了,注意BITMAPINFOHEADER的构造。
jethao 2004-09-06
  • 打赏
  • 举报
回复
顶一下!
jethao 2004-09-02
  • 打赏
  • 举报
回复
改了一下函数,自己构造了BITMAPINFOHEADER,BITMAPINFO,然后CreateDIBitmap,但是还是一个黑色的图像,百思不得其解?高人指点一下吧!

LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR pVideoHdr)
{
CDC* pDC; //绘图设备
CRect rect, picRect; //矩形区域对象
CWnd *pWnd; //得到图片框的窗口指针
CDC memDC; //兼容DC
HBITMAP bmpDisplay;
BITMAPINFOHEADER bmihdr;
BITMAPINFO bmi;

//构造bmp的信息头文件信息
bmihdr.biSize = sizeof(BITMAPINFOHEADER);
bmihdr.biWidth = 320;//CapStatus.uiImageWidth;
bmihdr.biHeight = 240;//CapStatus.uiImageHeight;
bmihdr.biPlanes = 1;
bmihdr.biBitCount = 24;
bmihdr.biCompression = BI_RGB;
bmihdr.biSizeImage = pVideoHdr->dwBufferLength;
bmihdr.biXPelsPerMeter = 1024;
bmihdr.biYPelsPerMeter = 768;
bmihdr.biClrImportant = 0;
bmihdr.biClrUsed = 0;

//bmi.bmiColors = NULL;
bmi.bmiHeader = bmihdr;

pWnd = AfxGetMainWnd();
pWnd= pWnd->GetDlgItem(IDC_PIC); //取得控件句柄

//根据位图的大小改变窗口的大小
pWnd->SetWindowPos(NULL,0,0,320,240,SWP_NOMOVE);

//在内存中生成一个兼容设备,然后拷贝到屏幕显示
pDC = pWnd->GetDC(); //取得绘图设备
memDC.CreateCompatibleDC(pDC);//生成一个兼容设备

//创建位图
bmpDisplay = ::CreateDIBitmap(memDC,&bmihdr,CBM_INIT,pVideoHdr->lpData,&bmi,DIB_RGB_COLORS);

//在兼容设备中装载位图
memDC.SelectObject (&bmpDisplay);

//显示
pWnd->GetClientRect(&rect); //得到控件窗口的"视"区域
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

//释放申明的资源
pWnd->ReleaseDC(pDC);
DeleteDC(memDC);
DeleteObject(&bmpDisplay);

return (LRESULT) TRUE;
}

19,469

社区成员

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

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