directshow 怎么拍照?IAMVideoControl::SetMode

y1053715398 2012-12-06 03:04:41
请问大家如何利用directshow进行拍照啊
我贴一下代码,可是没有成功拍照,我在网上下了一个amcap 是可以拍照的
(解释:我用usb连接一台相机,我用amcap可以拍照保存到本地,我现在下了一个amcap源码,可是只能预览,不能拍照),在网上看到这样一段代码:
IAMVideoControl *pAMVidControl = NULL;
HRESULT hr = m_gcap.pVCap->QueryInterface(IID_IAMVideoControl,(void**)&pAMVidControl);
if(SUCCEEDED(hr))
{
AfxMessageBox(_T("success one"));
//find the still pin
IPin *pPin = 0;
hr = m_gcap.pBuilder->FindPin(m_gcap.pVCap,PINDIR_OUTPUT,&PIN_CATEGORY_STILL,0,FALSE,0,&pPin);
if(SUCCEEDED(hr))
{
AfxMessageBox(_T("success two"));
hr = pAMVidControl->SetMode(pPin,VideoControlFlag_Trigger);
pPin->Release();
}
pAMVidControl->Release();
还是不能拍照,请各位大神帮帮忙啊
...全文
566 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhou45214284 2015-05-23
  • 打赏
  • 举报
回复
楼主,问题解决了吗 我也遇到只能预览不能拍照的问题了
vincen_cn 2013-07-12
  • 打赏
  • 举报
回复
注意图像的宽度必须被4整除
y1053715398 2012-12-29
  • 打赏
  • 举报
回复
我在贴一下代码啊,现在保存bmp总是出错,代码如下: 我已经做了setmode了,就是不知道如何保存图片 我把我的代码贴出来 /////////////////////////////////////////////////////////////////////////////////////// 这个是拍照 IAMVideoControl *pAMVidControl = NULL; HRESULT hr = m_gcap.pVCap->QueryInterface(IID_IAMVideoControl,(void**)&pAMVidControl); if(SUCCEEDED(hr)) { //AfxMessageBox(_T("success one")); //find the still pin IPin *pPin = 0; hr = m_gcap.pBuilder->FindPin(m_gcap.pVCap,PINDIR_OUTPUT,&PIN_CATEGORY_STILL,0,FALSE,0,&pPin); if(SUCCEEDED(hr)) { //AfxMessageBox(_T("success two")); hr = pAMVidControl->SetMode(pPin,VideoControlFlag_Trigger); pPin->Release(); } pAMVidControl->Release(); } ////////////////////////////////////////////////////////////////////////////////////////////// 在网上看到保存图片使用ISampleGrabber 回调模式进行拍照我把代码也贴出来 ///////////////////////////////////////////////////////////////////////////////////////////// //这段代码是在初始化的时候调用的 IBaseFilter *pSG_Filter; HRESULT hr = CoCreateInstance(CLSID_SampleGrabber,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void**)&pSG_Filter); if(FAILED(hr)) { AfxMessageBox(_T("fail one")); } hr = m_gcap.pFg->AddFilter(pSG_Filter,L"SampleGrab"); if(FAILED(hr)) { AfxMessageBox(_T("fail two")); } IBaseFilter *pNull; hr =CoCreateInstance(CLSID_NullRenderer,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void**)&pNull); if(FAILED(hr)) { AfxMessageBox(_T("fail three")); } hr =m_gcap.pFg->AddFilter(pSG_Filter,L"NullRender"); if(FAILED(hr)) { AfxMessageBox(_T("fail four")); } //hr = m_gcap.pBuilder->RenderStream(&PIN_CATEGORY_STILL,&MEDIATYPE_Video, m_gcap.pVCap, NULL, m_gcap.pRender); //然后 通过RenderStream 将still pin ,sample grabber, null renderer 连接起来 hr =m_gcap.pBuilder->RenderStream(&PIN_CATEGORY_STILL,&MEDIATYPE_Video,m_gcap.pVCap,pSG_Filter,pNull); DWORD i = GetLastError(); CString str; str.Format(_T("renderStream error:%ld"),i); if(FAILED(hr)) { AfxMessageBox(str); //就是这里返回错误了,不知道为什么,getlasterror == 0 } //然后调用ISampleGrabber指针,来通过这个指针可以分配内存 ISampleGrabber *pSG; hr = pSG_Filter->QueryInterface(IID_ISampleGrabber,(void**)&pSG); if(FAILED(hr)) { AfxMessageBox(_T("fail six")); } pSG->SetOneShot(FALSE); pSG->SetBufferSamples(TRUE); //设置回调函数 pSG->SetCallback(&g_StillCapCB,1); // 0 = use the SampleCB callback method hr = pSG->GetConnectedMediaType(&g_StillMediaTyp); i = GetLastError(); str.Format(_T("GetConnecteMediaType error:%ld"),i); if(FAILED(hr)) { AfxMessageBox(str); } pSG->Release(); //媒体类型包含一个bitmapinfoheader结构来定义图片的格式,在程序退出之前一定要释放媒体类型 //On exit ,remember to release the media type . //FreeMediaType(g_StillMediaTyp); ///////////////////////////////////////////////////////////////////////////////////////////// 让后就是回调类了 /////////////////////////////////////////////////////////////////////////////////////////// void UpdatePictureNumber(); AM_MEDIA_TYPE g_StillMediaTyp; class SampleGrabberCallback :public ISampleGrabberCB { public: long lWidth; long lHeight; STDMETHODIMP_(ULONG) AddRef(){return 1;} STDMETHODIMP_(ULONG) Release(){return 2;} STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject) { if(NULL == ppvObject) return E_POINTER; if(riid == __uuidof(IUnknown)) { *ppvObject = static_cast<IUnknown*>(this); return S_OK; } if(riid == __uuidof(ISampleGrabberCB)) { *ppvObject = static_cast<ISampleGrabberCB*>(this); return S_OK; } return E_NOTIMPL; } STDMETHODIMP SampleCB(double Time, IMediaSample *pSample) { return E_NOTIMPL; } STDMETHODIMP BufferCB(double Time, BYTE *pBuffer, long BufferLen) { /* if((g_StillMediaTyp.majortype != MEDIATYPE_Video)|| (g_StillMediaTyp.formattype != FORMAT_VideoInfo)|| (g_StillMediaTyp.cbFormat < sizeof(VIDEOINFOHEADER))|| (g_StillMediaTyp.pbFormat == NULL)) { AfxMessageBox(_T("world111")); return VFW_E_INVALIDMEDIATYPE; } */ TCHAR xFileName[256]; UpdatePictureNumber(); wsprintf(xFileName, TEXT("C:\\%d.bmp"), g_PicNumber++); SaveBitmap(pBuffer,BufferLen,xFileName); /* HANDLE hf = CreateFile(xFileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL); if(hf == INVALID_HANDLE_VALUE) { AfxMessageBox(_T("world222")); return E_FAIL; } long cbBitmapInforSize = g_StillMediaTyp.cbFormat-SIZE_PREHEADER; VIDEOINFOHEADER *pViderHeader = (VIDEOINFOHEADER*)g_StillMediaTyp.pbFormat; BITMAPFILEHEADER bfh; ZeroMemory(&bfh,sizeof(bfh)); bfh.bfType = 'MB'; bfh.bfSize = sizeof(bfh) +BufferLen +cbBitmapInforSize; bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + cbBitmapInforSize; //write the file header DWORD dwWritten = 0; WriteFile(hf,&bfh,sizeof(bfh),&dwWritten,NULL); WriteFile(hf,HEADER(pViderHeader),cbBitmapInforSize,&dwWritten,NULL); WriteFile(hf,pBuffer,BufferLen,&dwWritten,NULL); CloseHandle(hf); */ return S_OK; } //创建位图文件 BOOL SaveBitmap(BYTE * pBuffer, long lBufferSize ,TCHAR FileName[]) { HANDLE hf = CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READ, NULL,CREATE_ALWAYS, NULL, NULL ); if( hf == INVALID_HANDLE_VALUE )return 0; // 写文件头 BITMAPFILEHEADER bfh; memset( &bfh, 0, sizeof( bfh ) ); bfh.bfType ='MB'; bfh.bfSize = sizeof( bfh ) + lBufferSize + sizeof( BITMAPINFOHEADER ); bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER ); DWORD dwWritten = 0; WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL ); // 写位图格式 BITMAPINFOHEADER bih; memset( &bih, 0, sizeof( bih ) ); bih.biSize = sizeof( bih ); bih.biWidth = lWidth; bih.biHeight = lHeight; bih.biPlanes = 1; bih.biBitCount = 24; WriteFile( hf, &bih, sizeof( bih ), &dwWritten, NULL ); // 写位图数据 WriteFile( hf, pBuffer, lBufferSize, &dwWritten, NULL ); CloseHandle( hf ); return 0; } }; SampleGrabberCallback g_StillCapCB; ////////////////////////////////////////////////////////////////////////////////////////// 保存的图片总是乱的,花图片,请各位大神指教啊 在这里先谢谢各位了
y1053715398 2012-12-10
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
要不先保存成.bmp,后台再自动运行命令行工具程序将.bmp转.jpg?
保存bmp怎么做的?
y1053715398 2012-12-10
  • 打赏
  • 举报
回复
我就是用的上面的那段代码就是拍照的,可是我就是不知道怎么把图片保存下来
Ricky_521 2012-12-07
  • 打赏
  • 举报
回复
请问一下,你有完整的代码来用directshow来拍照嘛?我也需要用到这段代码,可是找不到完整的代码,希望能帮我一下,谢谢
赵4老师 2012-12-07
  • 打赏
  • 举报
回复
要不先保存成.bmp,后台再自动运行命令行工具程序将.bmp转.jpg?
y1053715398 2012-12-07
  • 打赏
  • 举报
回复
我自己顶一下啊,应该是已经拍照了,但是我不知道怎么保存图片城jpg格式的啊?

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧