如何保存picture控件的图片?

yeyuanzhi2000 2010-01-19 08:02:09
我用picture控件显示视频。现在想做一个视频快照,保存其中一帧的图片。下面我找到一个保存对话框图片的代码:
CClientDC SHDC(this);//
CPaintDC dc(this);
CDC memDC;
CRect rect;
GetClientRect(rect);

memDC.CreateCompatibleDC(&SHDC);
CBitmap bm;
int Width = rect.Width();//
int Height = rect.Height();//
bm.CreateCompatibleBitmap(&SHDC, Width, Height);
CBitmap* pOld = memDC.SelectObject(&bm);
memDC.BitBlt(0, 0, Width, Height, &SHDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOld);
BITMAP btm;
bm.GetBitmap(&btm);
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(dc,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);
}

哪位高手能帮我修改?谢谢!!
...全文
212 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProgrammerNO1 2010-01-20
  • 打赏
  • 举报
回复
用IImage有啥弊端
青稞 2010-01-20
  • 打赏
  • 举报
回复
编译错误中已经提示你了啊..要用CBitmap阿....
会飞的老鱼 2010-01-20
  • 打赏
  • 举报
回复
将 bm.GetBitmap(&btm); 改为

CBitmap m_bm;
m_bm.Attch(bm);
m_bm.GetBitmap(&btm);

即可
hzy694358 2010-01-20
  • 打赏
  • 举报
回复
mark
快乐鹦鹉 2010-01-20
  • 打赏
  • 举报
回复
HBITMAP bm=CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
===
HBITMAP是个结构体,不是类,没有成员函数。需要用CBitmap。
CBitmap *pBmp = CBitmap::FromHandle(bm);
pBmp->GetBitmap(&btm);
yeyuanzhi2000 2010-01-19
  • 打赏
  • 举报
回复
我是这样修改的:
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);//问题出在这里,怎么回事?
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);
}

但是编译出错:
error C2228: left of '.GetBitmap' must have class/struct/union type
请高手指点。谢谢!!
kuailekemi 2010-01-19
  • 打赏
  • 举报
回复
关注
yeyuanzhi2000 2010-01-19
  • 打赏
  • 举报
回复
我的自绘视频框代码如下:
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);
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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