directshow生成图片解决方法
directshow生成图片
HRESULT SnapStill()
{
HRESULT hr;
long cbBuffer = 0;
hr = pGrabber-> GetCurrentBuffer(&cbBuffer, NULL);
if(FAILED(hr)) return E_FAIL;
char *pBuffer = new char[cbBuffer];
if (!pBuffer) {
// Deal Out of memory. Return an error code.
}
hr = pGrabber-> GetCurrentBuffer(&cbBuffer, (long*)pBuffer);
if(FAILED(hr)) return E_FAIL;
//生成Bitmap
AM_MEDIA_TYPE mt;
hr = pGrabber-> GetConnectedMediaType(&mt);
if (FAILED(hr)) return E_FAIL;
VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)mt.pbFormat;
if(pVideoHeader==NULL) return E_FAIL;
BITMAPINFO BitmapInfo;
ZeroMemory(&BitmapInfo, sizeof(BitmapInfo));
CopyMemory(&BitmapInfo.bmiHeader, &(pVideoHeader-> bmiHeader), sizeof(BITMAPINFOHEADER));
HBITMAP hBitmap;
hBitmap = ::CreateDIBitmap(::GetDC(NULL), &(pVideoHeader-> bmiHeader), CBM_INIT, pBuffer, &BitmapInfo, DIB_RGB_COLORS);
if(hBitmap==NULL) return E_FAIL;
**************************************************************
在这里就返回了,CreateDIBitmap有什么错误的地方吗?
******************************************************************
CString strSaveFileName= " ";
CFileDialog filedlg(FALSE,_T( "bmp "),_T( " "),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T( "BMP(*.bmp) "));
if(filedlg.DoModal()==IDOK){
strSaveFileName=filedlg.GetPathName();
SaveBitmapToFile(hBitmap,strSaveFileName.GetBuffer(0));
}
return hr;
}
------解决方案--------------------
给你看看我的代码:
m_bmi.bmiHeader.biSizeImage = lBufferSize;
HWND hDesk = GetDesktopWindow();
HDC hDC = GetDC(hDesk);
HBITMAP hBmp = CreateDIBitmap(hDC, &m_bmi.bmiHeader, CBM_INIT, pBuffer, &m_bmi, DIB_RGB_COLORS);
if(hBmp)
{
.............
DeleteObject(hBmp);
}
else
{
DWORD dwErr = GetLastError();
.............
}
ReleaseDC(hDesk, hDC);
============
其中m_bmi事先做了如下初始化:
memset(&m_bmi, 0, sizeof(m_bmi));
m_bmi.bmiHeader.biSize = sizeof(m_bmi.bmiHeader);
m_bmi.bmiHeader.biPlanes = 1;
m_bmi.bmiHeader.biBitCount = 24;
m_bmi.bmiHeader.biWidth = nWidth;
m_bmi.bmiHeader.biHeight = nHeight;
HRESULT SnapStill()
{
HRESULT hr;
long cbBuffer = 0;
hr = pGrabber-> GetCurrentBuffer(&cbBuffer, NULL);
if(FAILED(hr)) return E_FAIL;
char *pBuffer = new char[cbBuffer];
if (!pBuffer) {
// Deal Out of memory. Return an error code.
}
hr = pGrabber-> GetCurrentBuffer(&cbBuffer, (long*)pBuffer);
if(FAILED(hr)) return E_FAIL;
//生成Bitmap
AM_MEDIA_TYPE mt;
hr = pGrabber-> GetConnectedMediaType(&mt);
if (FAILED(hr)) return E_FAIL;
VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)mt.pbFormat;
if(pVideoHeader==NULL) return E_FAIL;
BITMAPINFO BitmapInfo;
ZeroMemory(&BitmapInfo, sizeof(BitmapInfo));
CopyMemory(&BitmapInfo.bmiHeader, &(pVideoHeader-> bmiHeader), sizeof(BITMAPINFOHEADER));
HBITMAP hBitmap;
hBitmap = ::CreateDIBitmap(::GetDC(NULL), &(pVideoHeader-> bmiHeader), CBM_INIT, pBuffer, &BitmapInfo, DIB_RGB_COLORS);
if(hBitmap==NULL) return E_FAIL;
**************************************************************
在这里就返回了,CreateDIBitmap有什么错误的地方吗?
******************************************************************
CString strSaveFileName= " ";
CFileDialog filedlg(FALSE,_T( "bmp "),_T( " "),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T( "BMP(*.bmp) "));
if(filedlg.DoModal()==IDOK){
strSaveFileName=filedlg.GetPathName();
SaveBitmapToFile(hBitmap,strSaveFileName.GetBuffer(0));
}
return hr;
}
------解决方案--------------------
给你看看我的代码:
m_bmi.bmiHeader.biSizeImage = lBufferSize;
HWND hDesk = GetDesktopWindow();
HDC hDC = GetDC(hDesk);
HBITMAP hBmp = CreateDIBitmap(hDC, &m_bmi.bmiHeader, CBM_INIT, pBuffer, &m_bmi, DIB_RGB_COLORS);
if(hBmp)
{
.............
DeleteObject(hBmp);
}
else
{
DWORD dwErr = GetLastError();
.............
}
ReleaseDC(hDesk, hDC);
============
其中m_bmi事先做了如下初始化:
memset(&m_bmi, 0, sizeof(m_bmi));
m_bmi.bmiHeader.biSize = sizeof(m_bmi.bmiHeader);
m_bmi.bmiHeader.biPlanes = 1;
m_bmi.bmiHeader.biBitCount = 24;
m_bmi.bmiHeader.biWidth = nWidth;
m_bmi.bmiHeader.biHeight = nHeight;