我想利用视频回调函数中的参数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!!!!!)
求求大家了。我实在是没办法了!
{
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!!!!!)
求求大家了。我实在是没办法了!
16bit有可能是5-6-5"高彩",那么它的bmiHeader.biBitCount就是16,而BmiHeader.biCompression就等于3..
正确填写BITMAPINFO(包括BITFIELDS的3个掩码就能保存)..
是不是图像本身没有那么大,所以lpVHdr->dwBytesUsed也就小了。