【问题标题】:Capturing screenshot of windowed OpenGL window in AutoIt?在 AutoIt 中捕获窗口化 OpenGL 窗口的屏幕截图?
【发布时间】:2012-01-04 06:07:37
【问题描述】:

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

我认为如果我可以生成示例,向其发送一些输入,然后截取 OpenGL 区域的屏幕截图,对我的区域执行相同操作,然后比较这些屏幕截图,那将是一件很酷的事情。我还认为像 AutoIT 这样的东西会是做这种事情的最简单的方法。

我知道我可以使用截屏功能,但我不确定如何获取窗口的 OpenGL 区域(不是标题栏/周围窗口的东西)的确切坐标和大小。

如果有人可以帮助我,那就太好了。 或者,如果有人能想出比 AutoIt 更简单的解决方案,并且可以为我指明正确的方向,那就太好了。

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

【问题讨论】:

  • "对于我的图形类,我需要以像素完美的方式匹配 OpenGL 示例输出。"请注意,OpenGL 实现不会产生像素完美的结果。您应该与负责您班级的任何人交谈并告知他们这一事实。
  • 我们实际上是在使用 GLUT,只暴露了一个 SetPixel 函数,编写软件光栅化器。所以我觉得这会在同一台机器上产生相同的输出。
  • 你需要一个屏幕抓取工具。

标签: windows opengl scripting automation autoit


【解决方案1】:

AutoIt 是一个非常适合这项工作的工具。我想您已经在帮助文件中找到了 _ScreenCapture,它具有以下参数:X 左、Y 上、X 右和 Y 下坐标。但是,_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 的 Autoit 帮助文件为例。

【讨论】:

    【解决方案2】:

    如果您想从 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 并查看参考以获取更多信息。

    【讨论】:

    • 好的,问题是我无法访问示例程序的源代码,所以我必须尝试捕获我无法编辑的程序的确切输出。跨度>
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多