Linux下C语言的全屏操作

Linux下C语言的全屏操作,c,linux,screen,C,Linux,Screen,我正在寻找操纵整个屏幕的方法(例如更改色调、创建效果等),而不仅仅是一个窗口或单独的全屏输出。相反,您在屏幕、桌面、浏览器窗口等上看到的所有内容都来自一个程序。以root用户身份运行不是问题 目的是在受试者正常使用计算机的情况下,对人类视觉进行神经学实验。如前所述,您可以使用伽马补偿曲线来实现这一点 有关如何使用Xorg X服务器完成此操作的详细信息,请检查xrandr实用程序源中的函数。该功能实现伽马校正和软件亮度控制,但也可以实现颜色平衡。但是,它不能用绿色或蓝色替换红色,也不能进行基于色调

我正在寻找操纵整个屏幕的方法(例如更改色调、创建效果等),而不仅仅是一个窗口或单独的全屏输出。相反,您在屏幕、桌面、浏览器窗口等上看到的所有内容都来自一个程序。以root用户身份运行不是问题

目的是在受试者正常使用计算机的情况下,对人类视觉进行神经学实验。

如前所述,您可以使用伽马补偿曲线来实现这一点

有关如何使用Xorg X服务器完成此操作的详细信息,请检查xrandr实用程序源中的函数。该功能实现伽马校正和软件亮度控制,但也可以实现颜色平衡。但是,它不能用绿色或蓝色替换红色,也不能进行基于色调的映射

基本上,每个红色、绿色和蓝色分量值都使用类似于的查找表进行补偿

red_transmitted_to_display   = red_lut[red_component];
green_transmitted_to_display = green_lut[green_component];
blue_transmitted_to_display  = blue_lut[blue_component];
通过硬件,零表示零强度,一些最大值表示最大强度。xrandr接口提供了一些函数,可以告诉您查找表中颜色组件的深度(每个表有多少个条目),以及获取和设置表本身


如果您想进行更细粒度的颜色映射,如将暗红色变为蓝色,但将亮红色变为绿色,或者通常进行色调映射,则应该限制对某些合成窗口管理器的支持,例如compiz。然后,您需要实现一个Compiz插件,作为像素着色器进行必要的颜色转换

合成窗口管理器使用内存缓冲区首先绘制显示内容,然后将该缓冲区绘制到实际显示


Compiz支持插件,可以通过在数据发送到实际显示器之前操纵数据(在硬件中,通过着色器)来修改窗口及其内容的显示方式。一些插件改变窗口/视图/整个屏幕的放置方式,产生3D效果。另一些,特别是像素着色器,对显示的每个像素进行操作,并可以以所需的任何方式操纵其颜色。甚至可以只对某些窗口应用该操作,而不对其他窗口应用该操作,并在运行时对其进行控制。

听起来像是图形驱动程序的工作。这不是所谓的“皮肤”吗?例如?f.lux只能更改色调,不能向屏幕添加任何内容。否则就可以了。谢谢你的回答!然而,我正在寻找更强大的东西(比如Compiz插件可以做什么),但不是特定于系统的。在Linux中没有标准的方法可以做到这一点?@user279078:并非所有系统都像Microsoft Windows那样工作。也许你应该把精力集中在Windows上?它应该更符合您的期望和解决问题的方法。我正在进行一项非常小的试点研究。我和我的测试团队都只使用Linux,尽管没有人运行Compiz。我怀疑视频内存在某种程度上是可以访问的,也许内核提供了一些东西…@user279078:我明白了。问题是,当compiz不在使用时,X服务器会直接写入视频内存,而您的用例涉及到恰好在该点修改该数据。除了修改X服务器本身,对它写入的所有数据进行转换之外,我不知道在没有合成窗口管理器的情况下如何进行全彩操作。我想说,您的测试团队应该转向使用compiz,以允许使用简单的compiz插件进行这种操作。