我想利用视频回调函数中的参数lpVHdr->lpData,将它保存成位图!我的代码如下:LRESULT CALLBACK CCatchPicView::FrameCallbackProc(HWND Hwndcap, LPVIDEOHDR lpVHdr)
{
HANDLE hFile = CreateFile("F:\\1\\SUNHUI.bmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,    
                      FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);  
BITMAPINFOHEADER bih;
    BITMAPFILEHEADER bfh;
    ZeroMemory(&bfh, sizeof(bfh));
ZeroMemory(&bih, sizeof(bih)); DWORD bmpsize=WIDTHBYTES(width*bicount)*height;  //(((bits)+31)/32*4)
    bfh.bfType = 'MB';  // Little-endian for "MB".
    bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + lpVHdr->dwBytesUsed;
bfh.bfReserved1 = 0;    
bfh.bfReserved2 = 0;    
bfh.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER); WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
WriteFile(hFile, &bih, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
WriteFile(hFile, lpVHdr->lpData, lpVHdr->dwBytesUsed, &dwWritten, NULL);
CloseHandle(hFile);         DWORD dwSize, dwWritten;
dwSize = capGetVideoFormatSize(Hwndcap);
capGetVideoFormat(Hwndcap, &bih, dwSize);
DWORD biCompression=(DWORD)bih.biCompression;
DWORD height=(DWORD)bih.biHeight;
DWORD width=(DWORD)bih.biWidth;
DWORD bicount=(DWORD)bih.biBitCount;
DWORD bisize=(DWORD)bih.biSizeImage;

  
}红色部分是我保存失败后进行的测试。我发现,采集的结果是每个像素是16位的(biBitCount=16!怎么可能,我看很多书都是说biBitCount=1,4,8,24!)而且我得到的biCompression并不是0。biHeight=640,biWidth=480,但是lpVHdr->dwBytesUsed竟然是61400(也就是说biHeight×biWidth×2=dwBytesUsed!!!!!
求求大家了。我实在是没办法了!

解决方案 »

  1.   

    正常..
    16bit有可能是5-6-5"高彩",那么它的bmiHeader.biBitCount就是16,而BmiHeader.biCompression就等于3..
    正确填写BITMAPINFO(包括BITFIELDS的3个掩码就能保存)..
      

  2.   

    lambochan兄,怎么保存?就是用你說的  正确填写BITMAPINFO  能保存成24bits的bmp嗎?你說的是我見到的回帖中比較靠譜的。
      

  3.   

    大概看了楼主的代码,好像width和height都不是从回调函数得到的图像参数里拿的。
    是不是图像本身没有那么大,所以lpVHdr->dwBytesUsed也就小了。