在AutoIt中捕获窗口化OpenGL窗口的截图?

时间:2011-11-22 21:13:19

标签: windows opengl scripting automation autoit

对于我的图形类,我需要以像素完美的方式匹配OpenGL样本输出。

我认为如果我可以生成样本,发送一些输入,然后截取确切的OpenGL区域的屏幕截图,为我做同样的事情,然后只是比较这些截图,那将会很酷。我还认为像AutoIT这样的东西是最简单的方法。

我知道我可以使用screencapture函数,但我不确定如何获得窗口的OpenGL区域的精确坐标和大小(不是标题栏/周围窗口的东西)。

如果有人能帮助我,那将是非常棒的。 或者,如果有人能想到比AutoIt更容易的解决方案,并且可以指出我正确的方向,那也会很棒。

编辑:我也无法访问示例输出程序的源代码。

2 个答案:

答案 0 :(得分:3)

AutoIt对于这项工作来说是一个非常好的工具。我想你已经在帮助文件中找到了_ScreenCapture,它有以下参数:X left,Y top,X right和Y bottom coordinates。但是,_ScreenCapture函数存储到文件中。我已经创建了一个库,您可以捕获部分屏幕或窗口,并将其保存到内存中。然后,您可以从内存中获取像素颜色,并将它们与现有像素进行比较。您可以在此处找到它:http://www.autoitscript.com/forum/topic/63318-get-or-read-pixel-from-memory-udf-pixelgetcolor-au3/

窗口中不包含标题栏和边框的部分称为“客户区”。您可以使用WinGetClientSize获取客户区的宽度和高度。或者,您可以在OpenGL控件上使用ControlGetPos来获取相对于窗口的X和Y,以及OpenGL控件的宽度和高度。结合WinGetPos,您应该能够计算_ScreenCapture所需的值。如果您使用“AutoIt窗口信息”工具,您应该能够找到一个好的方法。

最后,PixelChecksum功能是一个简单而简短的解决方案,它可以为您提供很少的控制,但可能正是您所需要的。获得OpenGL部件的坐标后,可以使用PixelChecksum并获得与屏幕像素相对应的值(像素的校验和)。然后,您可以将此值与预先记录的值进行比较,以判断屏幕上的像素是否完全相同。查看PixelChecksum的自动帮助文件以获取示例。

答案 1 :(得分:0)

如果要从OpenGL缓冲区捕获数据,可以使用旧版OpenGL(版本1.2左右)来完成此操作

glFinish();
glReadBuffer(GL_FRONT);
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
glReadPixels(ox, oy, w, h, mode, GL_UNSIGNED_BYTE, img);

其中:

  • oxoy是来源x和y
  • wh是宽度和高度
  • mode是模式,如果您要保存到BMP
  • ,则为GL_BGR
  • img是指向unsigned int *以将图像复制到
  • 的指针

您可以在互联网上搜索glReadPixels并查看参考资料以获取更多信息。