direct视频截图问题

kgzhw 2011-04-19 02:21:52
请问怎么将ddraw的离屏表面保存为一幅图片,bmp或jpg都行。

请高手指教!
...全文
132 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kgzhw 2011-05-01
  • 打赏
  • 举报
回复
谢谢楼上几位,问题已经解决了,就是通过p_hantom所说的将surface上的数据进行存储就行了,不过我这儿yuv数据,需要先转为RGB格式的数据在存为bmp格式文件就行了。
CyberLogix 2011-04-20
  • 打赏
  • 举报
回复
不用走GDI的DC了,得到数据后直接写道文家了了事
kgzhw 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 p_hantom 的回复:]
DDraw和D3D的工作方式和GDI不一样的,用DC根本得不到显存中的数据
既然你能获取DDraw的Surface还干啥绕个圈走GDI的DC呢
[/Quote]
请教高招!
IONPhantom 2011-04-20
  • 打赏
  • 举报
回复
DDraw和D3D的工作方式和GDI不一样的,用DC根本得不到显存中的数据
既然你能获取DDraw的Surface还干啥绕个圈走GDI的DC呢
IONPhantom 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kgzhw 的回复:]
引用 6 楼 p_hantom 的回复:
DDraw和D3D的工作方式和GDI不一样的,用DC根本得不到显存中的数据
既然你能获取DDraw的Surface还干啥绕个圈走GDI的DC呢

请教高招!
[/Quote]
我不是说了么,获取DDraw的Surface对象然后就可以直接存盘
如果程序不是你自己写的是别人的进程那就只能hook DDraw的API然后拦截调用了
kgzhw 2011-04-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oexpress 的回复:]
bi.bmiHeader.biWidth 和bi.bmiHeader.biHeight两个不因该为0
你应该得到离屏表面的宽和高信息,然活把这两个字段填写进去,呵呵
[/Quote]
我用的屏幕宽高以后,存下来的图片全是黑色的。
kgzhw 2011-04-19
  • 打赏
  • 举报
回复
执行GetDIBits(hDC, hBmp, 0, h, buf, &bi, DIB_RGB_COLORS);后buf中没有数据!!
CyberLogix 2011-04-19
  • 打赏
  • 举报
回复
bi.bmiHeader.biWidth 和bi.bmiHeader.biHeight两个不因该为0
你应该得到离屏表面的宽和高信息,然活把这两个字段填写进去,呵呵
kgzhw 2011-04-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oexpress 的回复:]
ddraw的离屏表面的类容就是RGG数据,你下个文件加上BMP的HEADER, 然后把数据些进去就保存为BITMAP了
[/Quote]
我在网上查到这样一段代码,我觉得思想和你的一样,但是执行后bi.bmiHeader.biWidth 和bi.bmiHeader.biHeight两个值始终为零;所有存下来的图片什么都没有。请问问题会出在那儿?

int w = GetSystemMetrics(SM_CXSCREEN);
int h = GetSystemMetrics(SM_CYSCREEN);
HDC hDC;
m_pDDSBACK->GetDC(&hDC);//m_pDDSBACK为离屏表面
HDC hMemDC = CreateCompatibleDC(hDC);
HBITMAP hBmp = CreateCompatibleBitmap(hDC, w, h);
HBITMAP hOld = (HBITMAP)SelectObject(hMemDC, hBmp);
BitBlt(hMemDC, 0, 0, w, h, hDC, 0, 0, SRCCOPY);
int span = 3*w+((4-(3*w)&3)&3); //trim up to DWORD
BYTE *buf = new BYTE[span*h];
memset(buf, 0, span*h);
BITMAPINFO bi;
memset(&bi, 0, sizeof(BITMAPINFO));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
GetDIBits(hDC, hBmp, 0, h, NULL, &bi, DIB_RGB_COLORS);
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biCompression = 0;
bi.bmiHeader.biSizeImage = span*h;
GetDIBits(hDC, hBmp, 0, h, buf, &bi, DIB_RGB_COLORS);
BITMAPFILEHEADER bfh;
memset(&bfh, 0, sizeof(BITMAPFILEHEADER));
bfh.bfType = 'B '| 'M ' <<8;
bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ span*h;
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
HANDLE hFile = CreateFile( "snag1.bmp ", GENERIC_WRITE, 0, 0,
CREATE_ALWAYS, 0, 0);
DWORD dw;
WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dw, NULL);
WriteFile(hFile, &bi.bmiHeader, sizeof(BITMAPINFOHEADER), &dw, NULL);
WriteFile(hFile, buf, span*h, &dw, NULL);
CloseHandle(hFile);
SelectObject(hDC, hOld);
DeleteObject(hBmp);
DeleteDC(hMemDC);
m_pDDSBACK-> ReleaseDC(hDC);
delete buf;
CyberLogix 2011-04-19
  • 打赏
  • 举报
回复
ddraw的离屏表面的类容就是RGG数据,你下个文件加上BMP的HEADER, 然后把数据些进去就保存为BITMAP了

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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