我知道这听起来很愚蠢,而且我不打算使用这么多,但是有没有一种方法xrandr
或类似的方法可以使我的显示器显示相当于灰度但使用颜色而不是灰色的方法?我认为对于某些应用程序来说这将是一个非常酷的效果。
答案1
(这仅针对 X11,而不针对 Wayland 或其他显示管理系统。其中一些技术可以使用其他工具来应用,例如的辅助功能侏儒壳.)
我可以想到两种获得琥珀色显示的方法:插入一个修复所有颜色的合成插件,并创建一个颜色配置文件,将所有颜色校正为琥珀色的等效颜色。这两件事可能需要付出比其价值更多的努力(除了学习方面)。
您可以通过操纵每个通道的伽玛值来获得原色显示的良好近似值,如中所述西格维的回答;xcalib
也可以访问它,并允许直接控制亮度和对比度以及指定伽玛值:
xcalib -blue 1.0 0 1.0 -red 1.0 0 1.0 -alter
结果显示为绿色。亮度和对比度应用于伽玛斜坡,因此xrandr
可以让您获得相同的结果。
可以更精细地控制伽玛斜坡,但这无论如何都不允许您将所有内容重新映射为琥珀色。您可以将通道“钳制”到一定的范围,例如,亮红色会引入一些绿色,从而显得更像琥珀色,但深红色会显得绿色......
以下代码显示了如何执行此操作(没有错误处理):
#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/extensions/xf86vmode.h>
#include <stdlib.h>
int main(int argc, char **argv) {
Display * dpy = NULL;
int screen = -1;
u_int16_t * r_ramp = NULL, * g_ramp = NULL, * b_ramp = NULL;
unsigned int ramp_size = 256;
int r_tgt = 255, g_tgt = 191, b_tgt = 0;
int i;
dpy = XOpenDisplay(NULL);
screen = DefaultScreen(dpy);
/* Set up ramps */
XF86VidModeGetGammaRampSize(dpy, screen, &ramp_size);
r_ramp = (unsigned short *) calloc(ramp_size, sizeof(u_int16_t));
g_ramp = (unsigned short *) calloc(ramp_size, sizeof(u_int16_t));
b_ramp = (unsigned short *) calloc(ramp_size, sizeof(u_int16_t));
for (i = 0; i < ramp_size; i++) {
r_ramp[i] = r_tgt * 256 * i / ramp_size;
g_ramp[i] = g_tgt * 256 * i / ramp_size;
b_ramp[i] = b_tgt * 256 * i / ramp_size;
}
XF86VidModeSetGammaRamp(dpy, screen, ramp_size, r_ramp, g_ramp, b_ramp);
XCloseDisplay(dpy);
}
(您需要-lX11 -lXxf86vm
链接。)
答案2
xrandr --output $OUTPUT --gamma 1:0.01:0.01
给你一个几乎单色的红黑底色。
三组数字是伽玛校正的 rgb 值,以 : 分隔,范围为 0-1。替换为绿色,替换1:0.01:0.01
为蓝色。除了这三种基本颜色之外,很难做出任何其他颜色。一旦你开始让不止一种颜色透过,它就会变得非常明显。0.01:1:0.01
0.01:0.01:1
此方法仅适用于深色/黑色背景,因为亮白色的伽玛校正只是白色。
用于xrandr -q
查找要用于 的输出 ID $OUTPUT
;例如,我的笔记本电脑屏幕是 LVDS-1。
答案3
如果您使用支持插件的合成窗口管理器,您可能可以制作一个插件来根据需要更改屏幕像素,即计算输入像素的亮度并用琥珀色调制结果(根据需要来回应用伽玛校正) )。
这是一个黑客攻击的例子倒置KDE 窗口管理器 KWin 中的效果可以实现此目的。这个 hack 只需替换位于 KWin 源代码树下的反转效果着色器effects/invert/data/1.40/invert.frag
(假设您的 GPU 支持 GLSL 1.40)并使用自定义代码:
#version 140
uniform sampler2D sampler;
uniform vec4 modulation;
uniform float saturation;
in vec2 texcoord0;
out vec4 fragColor;
void main()
{
vec4 tex = texture(sampler, texcoord0);
float luminance = dot(vec3(0.2126729,0.7151522,0.0721750), pow(tex.rgb,vec3(2.2)));
float desaturated = pow(luminance, 1./2.2);
const vec3 amber=vec3(1.,0.5,0.);
tex.rgb = desaturated*amber;
tex *= modulation;
tex.rgb *= tex.a;
fragColor = tex;
}
在 KDE4 KWin 中,您可以简单地替换安装到的着色器文件(在上面给出的代码中/usr/share/apps/kwin/shaders/1.40/invert.frag
替换为)。不幸的是,从 KDE5 开始,着色器作为 Qt 资源内置到插件二进制文件中,因此您必须使用源树中编辑的文件重新编译 KWin,才能应用新着色器。texcoord0
varyingTexCoords
结果如下图所示,当通过快捷键组合激活该效果时(在 KDE4 KWin、Geforce GTX 750Ti 上使用专有技术进行测试)nvidia
驱动程序的 Geforce GTX 750Ti 上测试)。请注意,鼠标光标保持不变,因为它通常不是由窗口管理器渲染的,因此应该以其他方式更改它,或者模拟为飞涨效果确实如此。
答案4
哇!虽然可以更改终端的颜色。我很确定您不打算将桌面体验转换为灰度。
也就是说,这里涉及到几个移动部件。最相关的是您选择的终端仿真器。例如xterm
(自由BSD) (Linux)允许对演示文稿的许多方面进行修改。如果您正在寻找黑色背景上的琥珀色文本(琥珀色单色)。你可以这样完成它,
使用我的登录 shell,在桌面左上角创建一个 Xterm 窗口,87 行 x 57 列,具有黑色背景、琥珀色文本和琥珀色闪烁块光标
xterm -geometry 84x57+0+0 -C -ls -bg black -fg gold -cr gold
你可以甚至改变颜色指针 -ms color
注意我选择了金色,因为它看起来最接近我记忆中的琥珀色单色显示器的实际颜色。您可以在以下位置找到所有可用的颜色X11颜色表
说到登录外壳;另一个影响因素是您选择的外壳。我的是(t)csh,鉴于我对此很熟悉,我将为此提供另一个例子;
这是我的相关摘录.cshrc
...
setenv PAGER less
setenv BLOCKSIZE K
setenv CLICOLOR
# Colors!
set red="%{\033[1;31m%}"
set green="%{\033[0;32m%}"
set yellow="%{\033[1;33m%}"
set blue="%{\033[1;34m%}"
set magenta="%{\033[1;35m%}"
set cyan="%{\033[1;36m%}"
set white="%{\033[0;37m%}"
set end="%{\033[0m%}" # This is needed at the end
...
# Prompt style
set prompt = "${yellow}`/bin/hostname -s` %#${end} "
set promptchars = "%#"
这将有效地在黑色背景上提供琥珀色提示。您可以调整ANSI
转义序列以获得所需的确切黄色(琥珀色)色调。您还可以将这些转义序列应用于任何其他 shell 提示符。