Как я могу сделать снимок экрана с помощью Haskell в Mac OS X?

Как я могу сделать снимок экрана с помощью Haskell в Mac OS X?

Я прочитал захват экрана в Haskell?. Но я работаю на Mac Mini. Таким образом, решение для Windows неприменимо, а решение GTK не работает, потому что оно захватывает только черный экран. GTK на Mac захватывает только черные экраны.


person Juan Carlos Kuri Pinto    schedule 21.03.2013    source источник


Ответы (3)


Как я могу захватить экран с помощью … и OpenGL?

Только при некотором везении. OpenGL — это в первую очередь API для рисования, и содержимое основного буфера кадра не определено, если только оно не обращается к самим функциям OpenGL. То, что OpenGL можно было злоупотреблять, было связано с тем, как графическая система управляла буферами кадра своих экранных окон: после создания окна без предопределенного цвета фона/кисти его начальным содержимым буфера кадра было просто все, что было на экране прямо перед окном. творчество. Если поверх этого создается контекст OpenGL, фреймбуфер может быть прочитан с помощью glReadPixels, таким образом создавая снимок экрана.

Сегодня компоновка окон стала нормой, что делает злоупотребление OpenGL для создания скриншотов практически невозможным. При компоновке каждое окно имеет свой собственный закадровый буфер кадра, и содержимое экрана компонуется только в конце. Если вы использовали описанный выше метод, который опирается на неинициализированную память, содержащую желаемое содержимое, в оконной системе компоновки, результаты будут сильно различаться: от сплошного чистого цвета до сильно искаженных мусорных фрагментов и шума данных.

Так как надежное создание снимка экрана должно учитывать множество особенностей системы, в которой это должно произойти, практически невозможно написать действительно переносимую программу для создания снимков экрана.

И OpenGL определенно не подходит для этого, несмотря на то, что люди (включая меня) могли злоупотреблять этим в прошлом.

person datenwolf    schedule 21.03.2013
comment
Итак, вернет ли OpenGL тот же черный экран, что и GTK? Вы тестировали код на Mac? - person Juan Carlos Kuri Pinto; 21.03.2013
comment
@JuanCarlosKuriPinto: Маки — хитрые звери, потому что OpenGL настолько глубоко укоренился в ОС, что полагаться на неопределенное поведение OpenGL означает полагаться на неопределенное поведение ОС. Кроме того, пример GTK+ возвращает черный экран по той же причине, что и неопределенное поведение для OpenGL: при компоновке WM содержимое DC окна, будь то корневой DC, не будет содержать изображение, видимое на экране. - person datenwolf; 22.03.2013

Я запрограммировал этот код C для захвата экрана компьютеров Mac и отображения его в окне OpenGL с помощью функции glDrawPixels:

opengl-capture.c

http://pastebin.com/pMH2rDNH

Кодирование FFI для Haskell довольно тривиально. Я сделаю это в ближайшее время.

person Juan Carlos Kuri Pinto    schedule 06.07.2013

Это может быть полезно, чтобы найти решение в C:

NeHe Productions — Использование gluUnProject
http://nehe.gamedev.net/article/using_gluunproject/16013/

Списки рассылки Apple – Re: опубликован пример кода снимка экрана
http://lists.apple.com/archives/cocoa-dev/2005/Aug/msg00901.html

Компиляция программ OpenGL в Windows, Linux и OS X
http://goanna.cs.rmit.edu.au/~gl/teaching/Interactive3D/2012/compiling.html

Захват экрана Mac OS в формате GL_RGB

person Juan Carlos Kuri Pinto    schedule 21.03.2013
comment
Что именно gluUnProject помогает сделать скриншот. Это не очень хороший ответ, а даже если бы и был, то для неправильной задачи. - person datenwolf; 21.03.2013
comment
Ссылка объясняет, как правильно использовать glReadPixels для захвата цвета одного пикселя в определенном месте. Например: местоположение мыши. - person Juan Carlos Kuri Pinto; 22.03.2013
comment
Но это не то, о чем просил ОП. OP хочет использовать OpenGL для создания снимков экрана, то есть не просто считывать то, что было отрисовано с помощью OpenGL, но и то, что видно на всем дисплее. Нет необходимости перепроецировать какое-то место, и это также не решает проблему ОП. А именно, что OpenGL не подходит для этого. И последняя ссылка, которую вы разместили, описывает метод, основанный на неопределенном поведении, которое сломает момент его запуска в системе составного оконного менеджера. - person datenwolf; 22.03.2013