Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何使用Mac OS X上的Haskell捕捉屏幕?_Macos_Haskell_Screen Capture - Fatal编程技术网

Macos 如何使用Mac OS X上的Haskell捕捉屏幕?

Macos 如何使用Mac OS X上的Haskell捕捉屏幕?,macos,haskell,screen-capture,Macos,Haskell,Screen Capture,如何使用Mac OS X上的Haskell捕捉屏幕 我读过。但我正在研制一款Mac Mini。因此,Windows解决方案不适用,GTK解决方案不起作用,因为它只捕获黑屏。Mac中的GTK只能捕获黑屏 如何使用…和OpenGL捕获屏幕 只有运气好。OpenGL主要是一个绘图API,主帧缓冲区的内容未定义,除非由OpenGL函数自己绘制。OpenGL可能被滥用的原因是图形系统管理屏幕上窗口的帧缓冲区的方式:在创建没有预定义背景色/画笔的窗口后,其初始帧缓冲区内容只是创建窗口之前屏幕上的所有内容。如

如何使用Mac OS X上的Haskell捕捉屏幕

我读过。但我正在研制一款Mac Mini。因此,Windows解决方案不适用,GTK解决方案不起作用,因为它只捕获黑屏。Mac中的GTK只能捕获黑屏

如何使用…和OpenGL捕获屏幕

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

今天,窗口合成已成为常态,这使得滥用OpenGL截图几乎不可能。通过合成,每个窗口都有自己的屏幕外帧缓冲区,屏幕内容仅在最后合成。如果在合成窗口系统上使用上述方法(该方法依赖于包含所需内容的未初始化内存),则结果将发生巨大变化,从纯色到透明色,再到扭曲的垃圾碎片,再到数据噪声

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


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

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

NeHe产品-使用gluUnProject

苹果邮件列表-回复:屏幕快照示例代码发布

在Windows、Linux和OS X上编译OpenGL程序


我编写了此C代码以捕获Mac的屏幕,并通过函数glDrawPixels在OpenGL窗口中显示:

openglcapture.c


为Haskell编写FFI非常简单。我很快就会做的

那么,OpenGL会返回与GTK相同的黑屏吗?你在Mac上测试过一些代码吗?@JuanCarlosKuriPinto:Mac是一种狡猾的野兽,因为OpenGL在操作系统中根深蒂固,依赖OpenGL的未定义行为意味着依赖操作系统的未定义行为。GTK+示例返回黑屏的原因与OpenGL的未定义行为相同:使用合成WM,窗口DC的内容,无论是根DC,都不会包含屏幕上可见的图像。gluUnProject对抓取屏幕截图有什么帮助。这不是一个好的答案,即使它是,对于错误的问题。该链接解释了如何以正确的方式使用glReadPixels来捕获特定位置单个像素的颜色。例如:鼠标的位置。但这不是OP要求的。OP希望使用OpenGL制作屏幕截图,也就是说,不仅要读回使用OpenGL渲染的内容,还要读回整个屏幕上可见的内容。无需取消投影某些位置,也无法解决OP的问题。也就是说,OpenGL并不是实现这一点的合适工具。您发布的最后一个链接,它描述了一种依赖于未定义行为的技术,这种行为会在复合窗口管理器系统上运行的瞬间中断。