读取控制台调色板的 RGB 值

Jon*_*son 5 c c++ xterm console-application ansi-colors

\n\n

在C或C++中,有没有办法直接读取调色板RGB值?特别有趣的是 xterm(和其他)使用的扩展颜色空间来定义多达 256 种终端颜色。

\n\n

土豆

\n\n

恰当的例子是我想定义自己的颜色(使用 ANSI 转义序列,例如\\e]4;3;rgb:cc/78/33\\e\\\\或 直接在 c 中),但我需要在重新定义用户颜色之前保存它们(万一他们已经重新定义了颜色) )以便我可以在程序完成时恢复它们。破坏用户设置并不好。

\n\n

现在我的目标是使用 ANSI 转义序列以客户端方式执行此操作。但由于我找不到如何获取颜色,我开始考虑用 c 或 c++ 来实现这一点。

\n\n

该解决方案将被编写为具有本机扩展(基本上嵌入 c 或 c++ 代码)的 ruby​​ gem,我的目标是获得跨平台解决方案,即使主要目标是 OS X,其次是 Linux 环境......

\n\n

索斯

\n\n

从最初的实验开始,我已经可以为调色板中的代码点定义任何我想要的颜色。我还可以轻松恢复默认系统颜色(因为它们是 ANSI 标准)。我四处寻找在 ANSI 转义码中执行此操作的方法,但没有找到。我认为这是保存在内存中的某个地方,如果有任何方法可以找到位置,那么读取颜色应该很容易......

\n\n

甜点

\n\n

总结一下目前评论中的信息:

\n\n

看起来一致地执行此操作的唯一方法是用不同颜色打印 \xe2\x96\x88 字符的屏幕并从中获取颜色。由于这个项目应该是跨三个主要操作系统的平台,而且 Linux 目前在用户使用时有 3 个显示管理器,而 Windows 有两个(7 和 8),我只能想象时间和时间那会很有趣:)

\n\n

所以我的“解决方案”\xe2\x84\xa2 就是破坏用户的颜色(如果他们有除系统默认值之外的任何颜色......让我们面对它是相当不常见的)。我将提供一个设置文件,用户可以在其中告诉插件,如果他们对系统默认值不满意,应该恢复哪些颜色。务实又无聊,但这让我再次继续下去:)

\n

Spe*_*tre 2

[编辑 1]抱歉,这不会导致解决方案,但对于其他人,我添加了 DAC 调色板 IO 访问

看看旧的传统 EGA/VGA 参考资料...

  • 您可以通过 I/O 访问调色板
  • 我认为是端口 0x03C8、0x03C9 十六进制。
  • 当然,在现代操作系统中你无法访问它
  • 所以在 DOS-BOX 或其他任何地方尝试一下并保存原始调色板值,它们应该是相同的。

要直接访问,请尝试以下操作:

BYTE r,g,b,c=5; // R,G,B values are 6 bit only !!!
out 0x3C8,c;    // set color index to work with <0,255>
in  r,0x3C9;    // read color pallete for color c
in  g,0x3C9;    // not sure if it should be r,g,b 
in  b,0x3C9;    // or b,g,r ... i did not use it for too many years
out 0x3C8,c;    // set color index to work with <0,255>
out 0x3C9,r;    // write color pallete for color c
out 0x3C9,g;
out 0x3C9,b;
Run Code Online (Sandbox Code Playgroud)

C/C++ 没有 in,out 操作,因此使用:

BYTE i,o;       // this must be local !!!
WORD port;      // this must be local !!!
asm {
    mov dx,port // in i,port
    in al,dx
    mov o,al

    mov dx,port // out port,o
    mov al,o
    out dx,al
    }
Run Code Online (Sandbox Code Playgroud)