上市对微软的网站是如何捕捉使用IVMRWindowlessControl9 :: GetCurrentImage帧的例子......这里是做这件事的一种方法:
IBaseFilter* vmr9ptr; // I'm assuming that you got this pointer already
IVMRWindowlessControl9* controlPtr = NULL;
vmr9ptr->QueryInterface(IID_IVMRWindowlessControl9, (void**)controlPtr);
assert (controlPtr != NULL);
// Get the current frame
BYTE* lpDib = NULL;
hr = controlPtr->GetCurrentImage(&lpDib);
// If everything is okay, we can create a BMP
if (SUCCEEDED(hr))
{
BITMAPINFOHEADER* pBMIH = (BITMAPINFOHEADER*) lpDib;
DWORD bufSize = pBMIH->biSizeImage;
// Let's create a bmp
BITMAPFILEHEADER bmpHdr;
BITMAPINFOHEADER bmpInfo;
size_t hdrSize = sizeof(bmpHdr);
size_t infSize = sizeof(bmpInfo);
memset(&bmpHdr, 0, hdrSize);
bmpHdr.bfType = ('M' << 8) | 'B';
bmpHdr.bfOffBits = static_cast<DWORD>(hdrSize + infSize);
bmpHdr.bfSize = bmpHdr.bfOffBits + bufSize;
// Builder the bit map info.
memset(&bmpInfo, 0, infSize);
bmpInfo.biSize = static_cast<DWORD>(infSize);
bmpInfo.biWidth = pBMIH->biWidth;
bmpInfo.biHeight = pBMIH->biHeight;
bmpInfo.biPlanes = pBMIH->biPlanes;
bmpInfo.biBitCount = pBMIH->biBitCount;
// boost::shared_arrays are awesome!
boost::shared_array<BYTE> buf(new BYTE[bmpHdr.bfSize]);//(lpDib);
memcpy(buf.get(), &bmpHdr, hdrSize); // copy the header
memcpy(buf.get() + hdrSize, &bmpInfo, infSize); // now copy the info block
memcpy(buf.get() + bmpHdr.bfOffBits, lpDib, bufSize);
// Do something with your image data ... seriously...
CoTaskMemFree(lpDib);
} // All done!
值得一提的是,链接的示例代码使用了Sample Grabber。而且,C++代码要简单得多,因为你有智能指针来管理引用计数。 – 2012-07-09 18:28:21
Thanks Roman.R。我编写了WIA代码来捕捉图像几个小时,然后出现启动WIAVideo对象的错误,并发现[“WIA不支持Windows Server 2003,Windows Vista或更高版本中的视频设备。”](http:// msdn。 microsoft.com/en-us/library/ms630377(VS.85).aspx)。现在我认为唯一的选择是DirectShow,并使用不赞成使用的SampleGrabber。如此糟糕的MS。 – Shailesh 2012-07-10 10:48:49
除了ISampleGrabber之外,使用DirectShow捕获图像的任何帮助。请... – Shailesh 2012-07-11 08:51:37