VFW视频开发
想做个实时视频开发,用VFW做,遇到了点困难,有哪位大侠会的交流下啊。
问题如:
如何获得图像的文件头?
[解决办法]
其实我也不懂,总觉得回调函数啊自己派生的类什么的很麻烦,如果涉及线程什么的有些会不支持吧,于是回调就会出问题,帮你搜了下,涉及回调函数的
原地址
http://www.10moons.com/bbs/dispbbs.asp?boardid=19&replyid=81376&id=31190&page=41&skin=0&Star=2
sdk3000回调函数采集的图像yuy2如何转换为rgb24
/原始流回调函数. 使用CaptureFileAsBmp使用完成yuv2-rgb,可选择存储文件
void CALLBACK PrcCapSourceStreamCallBack( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount )
{
TRACE("CallBack\n");
DT("CallBack");
if(!g_bSnap)
return;
g_bSnap = FALSE;
BYTE *pRGB24Buffer = new BYTE[lnWidth*lnHeight*3];
BYTE *pYUVBuffer = new BYTE[lnWidth*lnHeight*lnBiCount];
//要进行倒置
for(int i = 0; i < lnHeight; i++)
{
memcpy(pYUVBuffer + i * lnWidth * lnBiCount,
(BYTE*)pBuf + (lnHeight - i - 1) * lnWidth * lnBiCount,lnWidth * lnBiCount);
}
//该函数在传文件名为空时仅仅将YUY2数据转为RGB24数据在pRGB24Buffer中输出。
CaptureFileAsBmp("c:\\aa.bmp",pYUVBuffer,pRGB24Buffer,lnWidth,lnHeight);
delete []pYUVBuffer;
delete []pRGB24Buffer;
将回调到的RGB数据写一个BMP的文件头存储为BMP
void CALLBACK VCPrcPicMessage( long lnCardID, long pBuf, long lnWidth, long lnHeight)
{
HANDLE hf; // file handle
BITMAPFILEHEADER hdr; // bitmap file-header
BITMAPINFOHEADER * pHeader; // bitmap info-header
DWORD dwTmp;
pHeader = (BITMAPINFOHEADER *) pBuf;
pHeader->biSize = sizeof(BITMAPINFOHEADER);
pHeader->biBitCount = 24;
pHeader->biWidth = lnWidth;
pHeader->biHeight = lnHeight;
pHeader->biPlanes = 1;
pHeader->biCompression = BI_RGB;
pHeader->biSizeImage = lnWidth * lnWidth * 3;
pHeader->biXPelsPerMeter = 0;
pHeader->biYPelsPerMeter = 0;
pHeader->biClrUsed = 0;
pHeader->biClrImportant = 0;
// Create the .BMP file.
hf = CreateFile("c:\\1.bmp",
GENERIC_READ
[解决办法]
GENERIC_WRITE,
(DWORD) 0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
if (hf == INVALID_HANDLE_VALUE)
return;
hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
// Compute the size of the entire file.
hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
pHeader->biSize + pHeader->biClrUsed
* sizeof(RGBQUAD) + pHeader->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
// Compute the offset to the array of color indices.
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
pHeader->biSize + pHeader->biClrUsed
* sizeof (RGBQUAD);
// Copy the BITMAPFILEHEADER into the .BMP file.
if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
(LPDWORD) &dwTmp, NULL))
{
return;
}
/*
// Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
if (!WriteFile(hf, (LPVOID) pHeader, sizeof(BITMAPINFOHEADER)
+ pHeader->biClrUsed * sizeof (RGBQUAD),
(LPDWORD) &dwTmp, NULL))
return;
*/
// Copy the array of color indices into the .BMP file.
if(!WriteFile(hf, (void*)pBuf, pHeader->biSizeImage, (LPDWORD) &dwTmp,NULL))
return;
// Close the .BMP file.
if (!CloseHandle(hf))
return;
}