社区
多媒体/流媒体开发
帖子详情
direct视频截图问题
kgzhw
2011-04-19 02:21:52
请问怎么将ddraw的离屏表面保存为一幅图片,bmp或jpg都行。
请高手指教!
...全文
134
10
打赏
收藏
direct视频截图问题
请问怎么将ddraw的离屏表面保存为一幅图片,bmp或jpg都行。 请高手指教!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
然而,对于某些用户来说,尤其是在进行
视频
截图
时,
Di
rect
Draw可能会导致
截图
结果变为全黑,这是一个常见的
问题
。 在Windows XP中,用户可以通过禁用
Di
rect
Draw来解决
截图
变黑的
问题
,但在Windows 7中,由于系统的...
电脑
视频
截图
后图片变成全黑怎么办.docx
标题中的
问题
直指一个常见的电脑使用困扰,即“电脑
视频
截图
后图片变成全黑”。这种情况通常是由于特定的显示设置或软件兼容性
问题
引起的。描述中提供了两种可能的解决方案,一种是通过禁用
Di
rect
Draw,另一种是...
c#实现屏幕
截图
,截取
视频
播放不黑屏
本文将深入探讨如何使用C#来实现这一功能,并特别关注如何解决
视频
播放时屏幕
截图
不出现黑屏的
问题
。 首先,我们需要了解基本的屏幕
截图
原理。在Windows操作系统中,我们可以使用G
DI
+库来实现屏幕捕捉。以下是一个...
Win7系统中
Di
rect
Draw无法被禁用怎么办.docx
然而,有时用户可能需要禁用
Di
rect
Draw,尤其是在遇到如
视频
截图
显示黑色或播放
问题
时。 在Windows XP中,用户可以直接禁用
Di
rect
Draw以解决这些
问题
。但在Windows 7中,系统设计不允许直接禁用
Di
rect
Draw,这给...
ffmpeg+D3D实现的MFC音
视频
播放器,支持录像、
截图
、音
视频
播放、码流信息显示等功能(工程源代码下载)
本播放器是在vs2019下开发,通过...音频的播放采用
Di
rect
Sound实现,将ffmpeg解码后的音频数据存储到
Di
rect
Sound的buffer中,再调用
Di
rect
Sound的play实现对音频的播放功能。码流信息的显示,通过D3D的文本绘制实现。
多媒体/流媒体开发
2,553
社区成员
20,277
社区内容
发帖
与我相关
我的任务
多媒体/流媒体开发
专题开发/技术/项目 多媒体/流媒体开发
复制链接
扫一扫
分享
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章