怎么抓屏幕的一块窗口进行录像呢 我怎么才能把屏幕上的某一块动态地抓取下来存成文件,比如正在操作的动作或播放的视频,以后再进行播放录像呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我用过snagit,非常好用,随便找桌面一块窗口就开始进行录像.但我不知道怎么做的,有没有高手懂呢 是不是等到程序的cdc 在一定时间内,copy 存起来...一秒存多少个是不是就行了... 这样吧GetScreenBmp可以得到当前屏幕的图象并保存成HBITMAP然后用下面的WriteBmp将它在磁盘上.你不妨用SetTimer设置个定时器,没秒钟存一张,合起来不就是动画片了吗?HBITMAP GetScreenBmp(){ HWND hwnd = ::GetDesktopWindow(); HDC hsrc = ::GetDC(hwnd); HDC hmemdc = ::CreateCompatibleDC(hsrc); RECT rc; ::GetWindowRect(hwnd,&rc); SIZE sz;sz.cx=rc.right-rc.left;sz.cy=rc.bottom-rc.top; HBITMAP hbmp = ::CreateCompatibleBitmap(hsrc,sz.cx,sz.cy); HGDIOBJ holdbmp = ::SelectObject(hmemdc,hbmp); ::BitBlt(hmemdc,0,0,sz.cx,sz.cy,hsrc,rc.left,rc.top,SRCCOPY); ::SelectObject(hmemdc,holdbmp); ::DeleteObject(hmemdc); ::ReleaseDC(hwnd,hsrc); return hbmp;}BOOL WriteBmp(HBITMAP hBitmap){ BITMAPINFO *m_pBMI; BYTE *m_pDIBData; BITMAPFILEHEADER bfh; BITMAPINFOHEADER bi; BITMAP BM; GetObject(hBitmap,sizeof(BM),&BM); HDC hdc=GetDC(NULL); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = BM.bmWidth; bi.biHeight = BM.bmHeight; bi.biPlanes = 1; bi.biBitCount = 24; bi.biCompression = 0; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; bfh.bfType=0x4d42; bfh.bfOffBits=sizeof(bfh)+sizeof(BITMAPINFOHEADER); bfh.bfSize=bfh.bfOffBits+BM.bmWidth*BM.bmHeight*3; bfh.bfReserved1=0; bfh.bfReserved2=0; m_pBMI=(BITMAPINFO*)new char[sizeof(BITMAPINFO)]; m_pDIBData=(BYTE*)new char[bfh.bfSize-bfh.bfOffBits]; memcpy(m_pBMI,&bi,sizeof(BITMAPINFOHEADER)); GetDIBits(hdc,hBitmap, 0l, (DWORD)bi.biHeight, (LPVOID)m_pDIBData,(LPBITMAPINFO)m_pBMI, (DWORD)DIB_RGB_COLORS); //StretchDIBits(dc.GetSafeHdc(),0,0,800,600,0,0,800,600,m_pDIBData,m_pBMI,DIB_RGB_COLORS,SRCCOPY); HANDLE hFile; DWORD dw; hFile=CreateFile("Screen.bmp", GENERIC_READ|GENERIC_WRITE, 0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL); if(hFile!=INVALID_HANDLE_VALUE) { WriteFile(hFile,(LPVOID)&bfh,sizeof(bfh),&dw,NULL); WriteFile(hFile,(LPVOID)m_pBMI,sizeof(BITMAPINFOHEADER),&dw,NULL); WriteFile(hFile,(LPVOID)m_pDIBData,BM.bmWidth*BM.bmHeight*3,&dw,NULL); CloseHandle(hFile); return TRUE; } return FALSE;} 还有,注意上面hFile=CreateFile("Screen.bmp", GENERIC_READ|GENERIC_WRITE, 0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);中的保存的文件名"Screen.bmp"自己要改哦.还有,如果一秒钟存一张,你的硬盘会很快挤满 你可以自己再编个播放软件,将一系列bmp文件连续播放出来成动画. 我用snagit怎么就抓不找动画呢,抓下来一播放,全是黑屏,什么都没有? hFile=CreateFile("Screen.bmp", GENERIC_READ|GENERIC_WRITE, 0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);中的保存的文件名"Screen.bmp"自己要改哦. 您可以将一系列的图片连成AVI,MSDN里有这方面的例程的.但不知如何边成GIF或MPEG,请高手指教! 在 http://www.atomixbuttons.com/vsc/中有你所需要的东西,并且有VC源代码,下载完后别忘了给分。 用directshow把,可以视频捕捉,还可以编辑 如果像上面说的这样,拿现在就是要把图片连成动画了,对吧?你可以用flash,将图片到如今去,保存成gif格式,就成了动画了。 使用WM encoder SDK,对截取屏幕很容易,而且可以压缩成一个WM格式的文件。 你先要了解一下avi ,bmp等文件格式,及directshow的基本操作,还要有directX的SDK,呵呵,好烦视频:你的视频不是天上掉下来的把,总有一个源,比如说avi文件,摄像头,或者一个网上的视频流,可以用directshow 把一些filter连接起来,比如用摄像头拍到的视频流做源filter,中间加什么转化mpeg,之类的filter,再写到avi中去屏幕操作:1记录开始抓取时间,有一个sdk函数 2可以先抓图成bmp 3建立一个avi文件,记住要自己定义avi文件的header,比如文件格式长短,帧格式,播放速度之类 4把每个bmp作为一帧加入avi中 5记录结束时间,就可以算出想要每秒几帧 6再重建一个avi文件,根据需要重写头,可以改变播放速度 7如果想要转成mpeg之类的就用上边视频的方法转把 关注中。我要一份原码[email protected] WM encoder SDK其中有关于屏幕拷贝成视频的部分,而开发snagit的公司还有一个产品是专门抓屏幕成视频的工具,号称取下来的视频数据效果最好,还可以向其它格式转换,叫com...(我记不住了),你到该公司的网上去看看,此外这个公司还提供相应的sdk,免费版的有标记,而正式版的又太贵了要美元上仟。 求一个UDP广播代码 为什么一个HDC可以连续使用呢??? 如何判断连入的点是VPN点,而不是真正的局域网内的连入点 CComboBoxEx如何添加项~~ vector::erase 大家都来说一下自己的编程经历,^-^ 一个关于MDI和View的问题,请指教 请问这句话怎么错了 请问如何隐藏IP。。。。。 请问谁有IPX/SPX的资料啊.windows下的我想做个网络的小程序不想用tcpip 只给我一堆数据,就叫我将其还原成位图图象,我该怎么办??望高高手能指明方向!!! 有关在asp中显示图片的问题[悬赏100分]
但我不知道怎么做的,有没有高手懂呢
一秒存多少个是不是就行了...
GetScreenBmp可以得到当前屏幕的图象并保存成HBITMAP
然后用下面的WriteBmp将它在磁盘上.
你不妨用SetTimer设置个定时器,没秒钟存一张,合起来不就是动画片了吗?
HBITMAP GetScreenBmp()
{
HWND hwnd = ::GetDesktopWindow();
HDC hsrc = ::GetDC(hwnd);
HDC hmemdc = ::CreateCompatibleDC(hsrc);
RECT rc; ::GetWindowRect(hwnd,&rc);
SIZE sz;sz.cx=rc.right-rc.left;sz.cy=rc.bottom-rc.top;
HBITMAP hbmp = ::CreateCompatibleBitmap(hsrc,sz.cx,sz.cy);
HGDIOBJ holdbmp = ::SelectObject(hmemdc,hbmp);
::BitBlt(hmemdc,0,0,sz.cx,sz.cy,hsrc,rc.left,rc.top,SRCCOPY);
::SelectObject(hmemdc,holdbmp);
::DeleteObject(hmemdc);
::ReleaseDC(hwnd,hsrc);
return hbmp;
}BOOL WriteBmp(HBITMAP hBitmap)
{
BITMAPINFO *m_pBMI;
BYTE *m_pDIBData;
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bi;
BITMAP BM;
GetObject(hBitmap,sizeof(BM),&BM);
HDC hdc=GetDC(NULL);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = BM.bmWidth;
bi.biHeight = BM.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biCompression = 0;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
bfh.bfType=0x4d42;
bfh.bfOffBits=sizeof(bfh)+sizeof(BITMAPINFOHEADER);
bfh.bfSize=bfh.bfOffBits+BM.bmWidth*BM.bmHeight*3;
bfh.bfReserved1=0;
bfh.bfReserved2=0;
m_pBMI=(BITMAPINFO*)new char[sizeof(BITMAPINFO)];
m_pDIBData=(BYTE*)new char[bfh.bfSize-bfh.bfOffBits];
memcpy(m_pBMI,&bi,sizeof(BITMAPINFOHEADER));
GetDIBits(hdc,hBitmap, 0l, (DWORD)bi.biHeight,
(LPVOID)m_pDIBData,(LPBITMAPINFO)m_pBMI, (DWORD)DIB_RGB_COLORS);
//StretchDIBits(dc.GetSafeHdc(),0,0,800,600,0,0,800,600,m_pDIBData,m_pBMI,DIB_RGB_COLORS,SRCCOPY);
HANDLE hFile;
DWORD dw;
hFile=CreateFile("Screen.bmp",
GENERIC_READ|GENERIC_WRITE,
0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);
if(hFile!=INVALID_HANDLE_VALUE)
{
WriteFile(hFile,(LPVOID)&bfh,sizeof(bfh),&dw,NULL);
WriteFile(hFile,(LPVOID)m_pBMI,sizeof(BITMAPINFOHEADER),&dw,NULL);
WriteFile(hFile,(LPVOID)m_pDIBData,BM.bmWidth*BM.bmHeight*3,&dw,NULL);
CloseHandle(hFile);
return TRUE;
}
return FALSE;}
hFile=CreateFile("Screen.bmp",
GENERIC_READ|GENERIC_WRITE,
0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);
中的保存的文件名"Screen.bmp"自己要改哦.
还有,如果一秒钟存一张,你的硬盘会很快挤满
GENERIC_READ|GENERIC_WRITE,
0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);
中的保存的文件名"Screen.bmp"自己要改哦.
2可以先抓图成bmp
3建立一个avi文件,记住要自己定义avi文件的header,比如文件格式
长短,帧格式,播放速度之类
4把每个bmp作为一帧加入avi中
5记录结束时间,就可以算出想要每秒几帧
6再重建一个avi文件,根据需要重写头,可以改变播放速度
7如果想要转成mpeg之类的就用上边视频的方法转把
我要一份原码
[email protected]