找回密码
 加入
搜索
查看: 5503|回复: 8

[图形处理] 如何对采用DirectX和OpenGL技术的视频或游戏进行截图

  [复制链接]
发表于 2012-4-26 11:23:55 | 显示全部楼层 |阅读模式
#include <ScreenCapture.au3>
_ScreenCapture_Capture(@DesktopDir & "\GDIPlus_Image1.jpg")
这样截出来是一片黑色
发表于 2012-4-26 12:41:04 | 显示全部楼层
实在不行只能考虑第三方截图工具,如FastStone Capture,操作都对应有快捷键的:

  Capture Active Window  <Alt + PrtSc>
   Capture Window / Object <Shift + PrtSc>
   Capture Rectangular Region <Ctrl + PrtSc>
   Capture Freehand Region <Ctrl + Shift + PrtSc>
   Capture Full Screen <PrtSc>
   Capture Scrolling Window <Ctrl + Alt + PrtSc>

  
可以使用  
To File (Auto Save) - captured image will be saved to a specified folder automatically
 楼主| 发表于 2012-4-26 13:10:41 | 显示全部楼层
回复 2# xiehuahere


    第三方不要
我想知道的是方法,原理
 楼主| 发表于 2012-4-26 13:13:12 | 显示全部楼层
好像用gdi+都不行的。。。
求方法啊
发表于 2012-4-26 14:21:36 | 显示全部楼层
本帖最后由 happytc 于 2012-4-26 14:38 编辑

回复 3# kenan


   因为_ScreenCapture_Capture函数是通过截取主表面(Primary Surface)中的数据来实现的。而视频或游戏基本上是用叫做覆盖表面(Overlay Surface)的数据,我们常用的截屏函数都是截取普通的primary surface中的数据,无法截取Overlay surface中的数据,而该死的微软又没有提供公共的API来获取Overlay surface中的数据,所以,黑屏就不足为奇了。Overlay是纯硬件支持的,而不OS的。显示设备在向屏幕显示数据的时候,会先判断该位置是否有Overlay,如果有,就显示Overlay中像素,如果没有,就使用Primary Surface中的像素。

简单的方法实现这种截图,就是关掉所谓的硬件加速:
①现在一般的软件本身可以设置来禁用Overlay技术,如Windows media player软件,就可以去掉‘使用覆盖’的勾;或叫开启软件显示模式(software rendering)
②在Windows上整个禁用Overlay,在DirectX控制面板上的‘显示’中禁用DirectDraw加速

若想不禁用Overlay情况下截图,就比较复杂了,一般你需要读取显卡缓冲中的overlay surface数据,再截取屏幕位图数据,然后你再把overlay得到数据转成图像后放在屏幕位图上面,也就是用bitBlt来合并它们
也就需要如下的步骤来做这种截图:
(1)获取显卡显示模式
(2)创建Plain Surface表面
(3)读取显存中的数据
(4)保存截图(这一步,微软倒是提供了D3DXSaveSurfaceToFile函数,这样就不用像用Bitblt那样,你得精确地把Overlay图像放准位置,不过得装Directx的SDK才能用)


========= 号外 ========
另外_ScreenCapture_Capture函数也不能截layered window窗口,也就是GUI加了$WS_EX_LAYERED样式的。这个不知道算不算Bug了,你可以在这个函数定义中的下面一行
_WinAPI_BitBlt($hCDC, 0, 0, $iW, $iH, $hDDC, $iLeft, $iTop, $__SCREENCAPTURECONSTANT_SRCCOPY)

替换成:
_WinAPI_BitBlt($hCDC, 0, 0, $iW, $iH, $hDDC, $iLeft, $iTop, BitOR($SRCCOPY, $CAPTUREBLT))

评分

参与人数 5金钱 +100 贡献 +10 收起 理由
posheng + 50 + 5 很给力!
lin6051 + 10 厉害 暂时解决 找图问题了
maker + 20 + 5 高手普及知识
user3000 + 10 谢谢,长知识了!
xiehuahere + 10 长见识了

查看全部评分

发表于 2012-4-26 15:13:22 | 显示全部楼层
回复  kenan


   另外_ScreenCapture_Capture函数也不能截layered window窗口,也就是GUI加了$WS_EX_LAYERED样式的。这个不知道算不算Bug了,你可以在这个函数定义中的下面一行
_WinAPI_BitBlt($hCDC, 0, 0, $iW, $iH, $hDDC, $iLeft, $iTop, $__SCREENCAPTURECONSTANT_SRCCOPY)

替换成:
_WinAPI_BitBlt($hCDC, 0, 0, $iW, $iH, $hDDC, $iLeft, $iTop, BitOR($SRCCOPY, $CAPTUREBLT))happytc 发表于 2012-4-26 14:21

果然,谢谢
 楼主| 发表于 2012-4-26 18:34:14 | 显示全部楼层
回复 5# happytc


    拜膜大神啊

不过如果有代码参考就更好了。。。具体的实现方法完全没头绪
(1)获取显卡显示模式
(2)创建Plain Surface表面
(3)读取显存中的数据
(4)保存截图

你那个截图工具不知可不可以截视频或游戏的图呢
发表于 2012-4-27 08:35:20 | 显示全部楼层
回复  happytc


    拜膜大神啊

不过如果有代码参考就更好了。。。具体的实现方法完全没头绪
(1) ...
kenan 发表于 2012-4-26 18:34


我的LiveCapture已经差不多被我弃了,快一年没有更新过了。当时主要是为了快速学习Au3而写它的。它也没有截Overlay图像的功能。

别等着别人的‘代码参考嘛,即然你有兴趣,你多多研究,写出这块来,我来参考你的代码学习呀
发表于 2012-4-27 10:29:44 | 显示全部楼层
directx 2d, opengl, 官网上好像有库
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-6 22:30 , Processed in 0.073130 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表