2

如何在 Mac OS X 上使用 Haskell 捕获屏幕?

我读过Haskell 中的屏幕截图?. 但我正在开发 Mac Mini。因此,Windows 解决方案不适用,GTK 解决方案不起作用,因为它只捕获黑屏。Mac 中的 GTK 仅捕获黑屏。

4

3 回答 3

2

如何使用……和 OpenGL 捕获屏幕?

只有运气好。OpenGL 主要是一个绘图 API,主帧缓冲区的内容是未定义的,除非它是由 OpenGL 函数自己绘制的。OpenGL 可能被滥用是由于图形系统确实管理其屏幕窗口的帧缓冲区的方式:在创建没有预定义背景颜色/画笔的窗口后,其初始帧缓冲区内容只是窗口之前屏幕上的所有内容创建。如果在此之上创建了 OpenGL 上下文,则可以使用 glReadPixels 读取帧缓冲区,从而创建屏幕截图。

如今,窗口合成已成为常态,这使得滥用 OpenGL 截取屏幕截图几乎是不可能的。通过合成,每个窗口都有自己的离屏帧缓冲区,并且屏幕的内容仅在最后合成。如果您在合成窗口系统上使用上述方法,该方法依赖于包含所需内容的未初始化内存,则结果将在纯色透明、严重扭曲的垃圾碎片和数据噪声之间大相径庭。

由于可靠地截取屏幕截图必须考虑到系统的许多特性,因此几乎不可能编写一个真正可移植的屏幕截图程序。

OpenGL 绝对不是它的错误工具,无论过去人们(包括我自己)是否能够滥用它。

于 2013-03-21T09:23:51.107 回答
0

我编写了这个 C 代码来捕获 Mac 的屏幕并通过函数 glDrawPixels 在 OpenGL 窗口中显示它:

opengl-capture.c

http://pastebin.com/pMH2rDNH

为 Haskell 编写 FFI 代码非常简单。我会尽快做的。

于 2013-07-06T09:39:54.967 回答
-2

这可能有助于在 C 中找到解决方案:

NeHe 制作 - 使用 gluUnProject
http://nehe.gamedev.net/article/using_gluunproject/16013/

Apple 邮件列表 - 回复:发布的屏幕快照示例代码
http://lists.apple.com/archives/cocoa-dev/2005/Aug/msg00901.html

在 Windows、Linux 和 OS X 上编译 OpenGL 程序
http://goanna.cs.rmit.edu.au/~gl/teaching/Interactive3D/2012/compiling.html

使用 GL_RGB 格式抓取 Mac OS 屏幕

于 2013-03-21T16:56:59.337 回答