Linux 的 C 语言全屏操作

Whole screen manipulation in C for Linux

我正在寻找操纵整个屏幕的方法(例如更改色调、创建效果等),而不仅仅是一个 window 或单独的全屏输出。相反,您在屏幕、桌面、浏览器 windows 等上看到的一切都来自一个程序。 运行 作为 root 没有问题。

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

就像Magnus Johansson已经提到的,你可以为此使用伽玛补偿曲线。

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

本质上,使用类似于

的查找table补偿每个红色、绿色和蓝色分量值
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 接口提供的函数可以告诉您查找 tables 中颜色分量的深度(每个条目有多少个条目),并自行获取和设置 tables。


如果你想做更细粒度的颜色映射,比如把深红色变成蓝色,但是把亮红色变成绿色,或者一般的色调映射,你应该限制对一些合成 window 管理器的支持,因为例子compiz。然后你需要实现一个 Compiz 插件,它作为像素着色器进行必要的颜色转换。

合成 window 管理器是使用内存缓冲区首先绘制显示内容,然后将该缓冲区绘制到实际显示或显示的管理器。

Compiz 支持插件,可以修改 windows 及其内容的显示方式,方法是在将数据发送到实际显示。一些插件会改变 windows/views/entire 屏幕的放置方式,从而产生 3D 效果。其他的,特别是 像素着色器 ,对显示的每个像素进行操作,并且可以以任何需要的方式处理它们的颜色。甚至可以只对某些 windows 而不是其他人应用操作,并在 运行 时间控制它。