我用picture控件显示视频。现在想做一个视频快照,保存其中一帧的图片。下面代码这样写不知行不?
CStatic* Rect=(CStatic*)GetDlgItem(IDC_VIDEO);
RECT rc;
Rect->GetClientRect(&rc);
HDC hdc=::GetDC(Rect->m_hWnd);
HBITMAP bm=CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
HDC memDC=CreateCompatibleDC(hdc);
HBITMAP hob=(HBITMAP)SelectObject(memDC,bm);
BitBlt(hdc,0,0,rc.right,rc.bottom,memDC,0,0,SRCCOPY); BITMAP btm;
bm.GetBitmap(&btm);//编译这里出错:
error C2228: left of '.GetBitmap' must have class/struct/union type
怎么回事?
DWORD size = btm.bmWidthBytes * btm.bmHeight;
LPSTR lpData =(LPSTR)GlobalAllocPtr(GPTR, size);
BITMAPFILEHEADER bfh;
/////////////////////////////////////////////
BITMAPINFOHEADER bih;
bih.biBitCount = btm.bmBitsPixel;
bih.biClrImportant = 0;
bih.biClrUsed = 0;
bih.biCompression = 0;
bih.biHeight = btm.bmHeight;
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = size;
bih.biWidth = btm.bmWidth;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
GetDIBits(hdc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
bfh.bfReserved1 = bfh.bfReserved2 = 0;
bfh.bfType = ((WORD)('M'<< 8)|'B');
bfh.bfSize = 54 + size;
bfh.bfOffBits = 54; CFileDialog dlg(false,_T("BMP"),_T("*.bmp"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("*.bmp|*.bmp|*.*|*.*|"));
if (dlg.DoModal()==IDOK)
{
CFile bf;
CString ss=dlg.GetPathName();
if(bf.Open(ss, CFile::modeCreate | CFile::modeWrite))
{
bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData, size);
bf.Close();
}
GlobalFreePtr(lpData);
}请高手指点,谢谢!!
CStatic* Rect=(CStatic*)GetDlgItem(IDC_VIDEO);
RECT rc;
Rect->GetClientRect(&rc);
HDC hdc=::GetDC(Rect->m_hWnd);
HBITMAP bm=CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
HDC memDC=CreateCompatibleDC(hdc);
HBITMAP hob=(HBITMAP)SelectObject(memDC,bm);
BitBlt(hdc,0,0,rc.right,rc.bottom,memDC,0,0,SRCCOPY); BITMAP btm;
bm.GetBitmap(&btm);//编译这里出错:
error C2228: left of '.GetBitmap' must have class/struct/union type
怎么回事?
DWORD size = btm.bmWidthBytes * btm.bmHeight;
LPSTR lpData =(LPSTR)GlobalAllocPtr(GPTR, size);
BITMAPFILEHEADER bfh;
/////////////////////////////////////////////
BITMAPINFOHEADER bih;
bih.biBitCount = btm.bmBitsPixel;
bih.biClrImportant = 0;
bih.biClrUsed = 0;
bih.biCompression = 0;
bih.biHeight = btm.bmHeight;
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = size;
bih.biWidth = btm.bmWidth;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
GetDIBits(hdc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
bfh.bfReserved1 = bfh.bfReserved2 = 0;
bfh.bfType = ((WORD)('M'<< 8)|'B');
bfh.bfSize = 54 + size;
bfh.bfOffBits = 54; CFileDialog dlg(false,_T("BMP"),_T("*.bmp"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("*.bmp|*.bmp|*.*|*.*|"));
if (dlg.DoModal()==IDOK)
{
CFile bf;
CString ss=dlg.GetPathName();
if(bf.Open(ss, CFile::modeCreate | CFile::modeWrite))
{
bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData, size);
bf.Close();
}
GlobalFreePtr(lpData);
}请高手指点,谢谢!!
pBitmap->GetBitmap(&btm);应该是这样吧。
GlobalAllocPtr' : undeclared identifier
我的自绘视频框代码如下
void CMainFrame::OnVideoData(CStatic* Rect,char* Video)
{
RECT rc;
Rect->GetClientRect(&rc);
HDC hdc=::GetDC(Rect->m_hWnd);
HBITMAP m_hBmp=CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
HDC hMemDC=CreateCompatibleDC(hdc);
HBITMAP hob=(HBITMAP)SelectObject(hMemDC,m_hBmp);
if(hob)
{
char* p;
p=Video;
BITMAPINFOHEADER* pbih=&m_CodecMgr[0].m_BmpU.bmiHeader;
HDRAWDIB h=DrawDibOpen();
DrawDibDraw(h,hMemDC,0,0,rc.right,rc.bottom,pbih,p,0,0,pbih->biWidth,pbih->biHeight,DDF_NOTKEYFRAME);
DrawDibClose(h);
BitBlt(hdc,0,0,rc.right,rc.bottom,hMemDC,0,0,SRCCOPY);
SelectObject(hMemDC,hob);
pbih=NULL;
delete pbih;
}
DeleteDC(hMemDC);
::ReleaseDC(Rect->m_hWnd,hdc);
DeleteObject(m_hBmp);
}
只能写filter实现,如果是VMR就没事