如何使用VFW获取一帧图像,并把图像的信息打包发送到客户端,然后在客户端显示成位图

chenyonken 2017-10-07 12:56:54
在做一个视频聊天软件,使用VFW,
使用函数capSetCallbackOnVideoStream(m_hWndVideo, EncodeCallback)来设置回调函数,回调函数的内容如下(功能是获取图像信息把那个保存在一块m_hGlobal内存中,CPackage类用于记录项客户端发送数据时的一些信息)
LRESULT WINAPI EncodeCallback(HWND hWnd, LPVIDEOHDR lpVHdr)
{
if (lpVHdr->dwFlags&VHDR_DONE)
{
static BOOL bSend = TRUE;
CServerDlg* pDlg = (CServerDlg*)AfxGetMainWnd();
int nState = pDlg->m_Video.GetCheck();
if (nState == 1)
{
if (pDlg->m_bSendImage==FALSE)
{
//获取图象数据
BITMAPINFO bmpInfo;
capGetVideoFormat(pDlg->m_hWndVideo, &bmpInfo, sizeof(BITMAPINFO));
//确定图象数据大小
int nSize = bmpInfo.bmiHeader.biSizeImage;
bSend = FALSE;
HGLOBAL hGlobal = GlobalAlloc(GHND, nSize + sizeof(BITMAPINFOHEADER));
BYTE* pData = (BYTE*)GlobalLock(hGlobal);
memcpy(pData, &bmpInfo.bmiHeader, sizeof(BITMAPINFOHEADER));

BYTE* pTmp = pData;
pTmp += sizeof(BITMAPINFOHEADER);
memcpy(pTmp, lpVHdr->lpData, nSize);

int nPackSize = sizeof(CPackage) + nSize + sizeof(BITMAPINFOHEADER);

if (pDlg->m_hGlobal != NULL)
{
GlobalFree(pDlg->m_hGlobal);
pDlg->m_hGlobal = NULL;
}

pDlg->m_hGlobal = GlobalAlloc(GHND, nPackSize);

BYTE* pSendData = (BYTE*)GlobalLock(pDlg->m_hGlobal);
CPackage* pPackage = (CPackage*)pSendData;
pPackage->m_Type = ptImage;
pPackage->m_dwContent = nSize + sizeof(BITMAPINFOHEADER);
pPackage->m_dwData = nSize + sizeof(BITMAPINFOHEADER);
pPackage->m_dwSize = sizeof(CPackage);
pTmp = pSendData;
pTmp += sizeof(CPackage);
memcpy(pTmp, pData, nSize + sizeof(BITMAPINFOHEADER));

GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
GlobalUnlock(pDlg->m_hGlobal);

pDlg->m_bSendImage = TRUE;
}
}
}
return 1;
}
本意是把图像的信息打包发送到客户端,然后在客户端还原为位图并显示,虽然已经在上面的回调函数里获得了图像的信息BITMAPINFO,但不知道怎么根据BITMAPINFO来“创建一个位图”,原本在客户端中是如下这样实现,但最终没有什么显示出来
else if (pPackage->m_Type==ptImage) //图像数据
{
BITMAPINFOHEADER bmpHeader;
BITMAPINFO bmpInfo;
bmpInfo.bmiHeader = bmpHeader;
memcpy(&bmpHeader, pPackage->m_Data, sizeof(bmpHeader));
BYTE* pBmpData = pPackage->m_Data;
pBmpData += sizeof(bmpHeader);
CDC* pDC = GetDC();
HBITMAP hBmp = CreateDIBitmap(pDC->m_hDC, &bmpHeader, CBM_INIT, pBmpData, (BITMAPINFO*)&bmpHeader, DIB_RGB_COLORS);
HBITMAP hOldBmp = m_Image.SetBitmap(hBmp);
if (hOldBmp != NULL)
{
DeleteObject(hOldBmp);
}
//显示图像
//...
}

现在不想考虑传送的问题,只希望在回调函数里能够根据BITMAPINFO信息来显示一张位图,求大神指教
...全文
603 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiter 2017-10-11
  • 打赏
  • 举报
回复
http://blog.csdn.net/chinabinlang/article/details/6082162
赵4老师 2017-10-07
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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