用vfw从摄像头中读取了每帧的图像数据,为什么图像显示不出来?解决思路
用vfw从摄像头中读取了每帧的图像数据,为什么图像显示不出来?
我用vfw的capSetCallbackOnFrame(m_hWndVideo,EncodeCallback);函数在每帧预览前调用回调函数:
LRESULT CALLBACK CMyViewDlg::EncodeCallback(HWND hWnd, LPVIDEOHDR lpVHdr)
{
//AfxMessageBox("yes");
//LPBYTE lpTemp = lpVHdr->lpData;
DWORD nBufferLength=lpVHdr->dwBufferLength;
DWORD nBytesUsed=lpVHdr->dwBytesUsed;//一个像素16位,2个字节
HWND aHwnd = AfxGetMainWnd()->m_hWnd;
::SendMessage(aHwnd,WM_FRAMEPROCESS_MESSAGE, (WPARAM)(lpVHdr->lpData), 0);
return TRUE;
}
然后产生一个自定义的消息WM_FRAMEPROCESS_MESSAGE,下面是自定义的消息响应函数:
LRESULT CMyViewDlg::OnFrameProcess(WPARAM wParam , LPARAM lParam)
{
LPBYTE lpTemp = (LPBYTE)wParam;
//将YUYV格式转换成RGB格式
LPBYTE pdata = new byte[640*480*3];
ZeroMemory(pdata, 640*480*3);
YUY2_RGB(pdata, lpTemp, 640, 480);
//绘图
CWnd *pWnd=GetDlgItem(IDC_PICSTATIC);
CDC* pDC=pWnd->GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC, 640, 480);//DDB
CBitmap* pOldBmp=MemDC.SelectObject(&bmp);
::SetDIBitsToDevice( MemDC.GetSafeHdc(),
0,
0,
640,
480,
0,
0,
0,
480,
pdata,
m_pBmpInfo,
DIB_RGB_COLORS
);
//是否抓图,如果抓图
if(isGetPic)
{
isGetPic=FALSE;
pDC->BitBlt(0, 0, 640, 480, &MemDC, 0, 0, SRCCOPY);
CString PicName;
WORD sYear,sMonth,sDay,sHour,sMinute,sSecond;
SYSTEMTIME CurTime;/////定义SYSTEMTIME类的对象
GetLocalTime(&CurTime);////获取本地时间
sYear=CurTime.wYear;
sMonth=CurTime.wMonth;
sDay=CurTime.wDay;
sHour=CurTime.wHour;
sMinute=CurTime.wMinute;
sSecond=CurTime.wSecond;
CString sFileName;
PicName.Format("%04d-%02d-%02d-%02d-%02d-%02d.bmp",
sYear,sMonth,sDay,sHour,sMinute,sSecond);
CString PicPath_one;
PicPath_one = PathPic+PicName;
CFile filePic(PicPath_one,
CFile::modeCreate|CFile::modeWrite);//存放报警图片
filePic.Write(m_pBmpfilehd,14);
filePic.Write(m_pBmpInfo,40);
filePic.Write(pdata,640*480*3);
}
return TRUE;
}
其中,位图文件头,和位图信息均在OnInitDialog()中定义:
// 初始化BITMAPINFO 结构,此结构在保存bmp文件、显示采集图像时使用
m_pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_pBmpInfo->bmiHeader.biWidth = 640;
m_pBmpInfo->bmiHeader.biHeight = 480;
m_pBmpInfo->bmiHeader.biBitCount = 24;
m_pBmpInfo->bmiHeader.biPlanes = 1;
m_pBmpInfo->bmiHeader.biCompression =0;
m_pBmpInfo->bmiHeader.biSizeImage =640*480*3;
m_pBmpInfo->bmiHeader.biXPelsPerMeter = 0;
m_pBmpInfo->bmiHeader.biYPelsPerMeter = 0;
m_pBmpInfo->bmiHeader.biClrUsed =0;
m_pBmpInfo->bmiHeader.biClrImportant = 0;
//初始化BITMAPFILEHEADER结构
m_pBmpfilehd = (LPBITMAPFILEHEADER)malloc(14);
if (m_pBmpfilehd == NULL)
{
return FALSE;
}
m_pBmpfilehd->bfType=0x4d42;
m_pBmpfilehd->bfSize=640*480*3+54;
m_pBmpfilehd->bfReserved1=0;
m_pBmpfilehd->bfReserved2=0;
m_pBmpfilehd->bfOffBits=54;
那为什么我抓图在IDC_PICSTATIC控件中显示为黑,存下来的图为绘图失败啊???
------解决方案--------------------
SetDIBitsToDevice函数的返回值是多少?
我用vfw的capSetCallbackOnFrame(m_hWndVideo,EncodeCallback);函数在每帧预览前调用回调函数:
LRESULT CALLBACK CMyViewDlg::EncodeCallback(HWND hWnd, LPVIDEOHDR lpVHdr)
{
//AfxMessageBox("yes");
//LPBYTE lpTemp = lpVHdr->lpData;
DWORD nBufferLength=lpVHdr->dwBufferLength;
DWORD nBytesUsed=lpVHdr->dwBytesUsed;//一个像素16位,2个字节
HWND aHwnd = AfxGetMainWnd()->m_hWnd;
::SendMessage(aHwnd,WM_FRAMEPROCESS_MESSAGE, (WPARAM)(lpVHdr->lpData), 0);
return TRUE;
}
然后产生一个自定义的消息WM_FRAMEPROCESS_MESSAGE,下面是自定义的消息响应函数:
LRESULT CMyViewDlg::OnFrameProcess(WPARAM wParam , LPARAM lParam)
{
LPBYTE lpTemp = (LPBYTE)wParam;
//将YUYV格式转换成RGB格式
LPBYTE pdata = new byte[640*480*3];
ZeroMemory(pdata, 640*480*3);
YUY2_RGB(pdata, lpTemp, 640, 480);
//绘图
CWnd *pWnd=GetDlgItem(IDC_PICSTATIC);
CDC* pDC=pWnd->GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC, 640, 480);//DDB
CBitmap* pOldBmp=MemDC.SelectObject(&bmp);
::SetDIBitsToDevice( MemDC.GetSafeHdc(),
0,
0,
640,
480,
0,
0,
0,
480,
pdata,
m_pBmpInfo,
DIB_RGB_COLORS
);
//是否抓图,如果抓图
if(isGetPic)
{
isGetPic=FALSE;
pDC->BitBlt(0, 0, 640, 480, &MemDC, 0, 0, SRCCOPY);
CString PicName;
WORD sYear,sMonth,sDay,sHour,sMinute,sSecond;
SYSTEMTIME CurTime;/////定义SYSTEMTIME类的对象
GetLocalTime(&CurTime);////获取本地时间
sYear=CurTime.wYear;
sMonth=CurTime.wMonth;
sDay=CurTime.wDay;
sHour=CurTime.wHour;
sMinute=CurTime.wMinute;
sSecond=CurTime.wSecond;
CString sFileName;
PicName.Format("%04d-%02d-%02d-%02d-%02d-%02d.bmp",
sYear,sMonth,sDay,sHour,sMinute,sSecond);
CString PicPath_one;
PicPath_one = PathPic+PicName;
CFile filePic(PicPath_one,
CFile::modeCreate|CFile::modeWrite);//存放报警图片
filePic.Write(m_pBmpfilehd,14);
filePic.Write(m_pBmpInfo,40);
filePic.Write(pdata,640*480*3);
}
return TRUE;
}
其中,位图文件头,和位图信息均在OnInitDialog()中定义:
// 初始化BITMAPINFO 结构,此结构在保存bmp文件、显示采集图像时使用
m_pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_pBmpInfo->bmiHeader.biWidth = 640;
m_pBmpInfo->bmiHeader.biHeight = 480;
m_pBmpInfo->bmiHeader.biBitCount = 24;
m_pBmpInfo->bmiHeader.biPlanes = 1;
m_pBmpInfo->bmiHeader.biCompression =0;
m_pBmpInfo->bmiHeader.biSizeImage =640*480*3;
m_pBmpInfo->bmiHeader.biXPelsPerMeter = 0;
m_pBmpInfo->bmiHeader.biYPelsPerMeter = 0;
m_pBmpInfo->bmiHeader.biClrUsed =0;
m_pBmpInfo->bmiHeader.biClrImportant = 0;
//初始化BITMAPFILEHEADER结构
m_pBmpfilehd = (LPBITMAPFILEHEADER)malloc(14);
if (m_pBmpfilehd == NULL)
{
return FALSE;
}
m_pBmpfilehd->bfType=0x4d42;
m_pBmpfilehd->bfSize=640*480*3+54;
m_pBmpfilehd->bfReserved1=0;
m_pBmpfilehd->bfReserved2=0;
m_pBmpfilehd->bfOffBits=54;
那为什么我抓图在IDC_PICSTATIC控件中显示为黑,存下来的图为绘图失败啊???
------解决方案--------------------
SetDIBitsToDevice函数的返回值是多少?