社区
多媒体/流媒体开发
帖子详情
direct视频截图问题
kgzhw
2011-04-19 02:21:52
请问怎么将ddraw的离屏表面保存为一幅图片,bmp或jpg都行。
请高手指教!
...全文
132
10
打赏
收藏
direct视频截图问题
请问怎么将ddraw的离屏表面保存为一幅图片,bmp或jpg都行。 请高手指教!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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了
windows 7中禁用
Di
rect
Draw
视频
截图
不再黑.docx
windows 7中禁用
Di
rect
Draw
视频
截图
不再黑.docx
Di
rect
Show实现
视频
的实时显示并抓图,可以设置
视频
参数
使用VS2013创建的工程,使用前需要安装并配置
Di
rect
Show环境。
Di
rect
Show实现
视频
的实时显示并抓图保存到本地。可以设置图像参数和
视频
格式。
di
ablo-ddrawwrapper:游戏
Di
ablo 1的
Di
rect
Draw包装器
它仅作为
Di
rect
Draw库的修改版本存在,然后由游戏在运行时加载。 这使其可以与任何版本的
Di
ablo(包括扩展版)一起使用。 已知的
问题
主菜单中的轻微刷新
问题
不能用于Battle.net上的游戏 只能在玩游戏时访问游戏中...
IPCPlaySDK:基于FFmpeg,
Di
rect
3D实现的
视频
(H.264,H.265)解码显示库,可提供超低延迟解码,支持GPU解码,实时转换文字,图案,保存
截图
,解码显示性能不输市面任何一款解码库,支持7x24连续稳定运行,是少有的高性能,低延迟的工业级开源解码显示库!
基于FFmpeg,
Di
rect
3D实现的
视频
(H.264,H.265)解码显示库,可提供超低延迟解码,支持GPU解码,实时替换文字,图案,保存
截图
! 2.解码显示性能不输市面上任何一个解码库,支持7x24连续稳定运行,是少有的高性能...
KKcapture v2.1.8 免费VIP版,亲测 可用
* 增加了
视频
解码插件,解决了有的用户无法播放
视频
的
问题
。 * 解决使用d3d9的游戏使用软件时崩溃的
问题
* 解决偶尔弹出对话框报网络
问题
,录制功能无法使用的
问题
。 KKcapture v1.0.3 TOP↑ * 解决部分游戏...
多媒体/流媒体开发
2,543
社区成员
20,281
社区内容
发帖
与我相关
我的任务
多媒体/流媒体开发
专题开发/技术/项目 多媒体/流媒体开发
复制链接
扫一扫
分享
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章