4

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

土豆

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

现在我的目标是使用 ANSI 转义序列以客户端方式执行此操作。但是因为我找不到你是如何得到颜色的,所以我开始考虑用 c 或 c++ 来做这件事。

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

从我最初的实验中,我已经到了可以为调色板中的代码点定义任何颜色的地步。我还可以轻松恢复默认系统颜色(因为它们是 ANSI 标准)。我在 ANSI 转义码中寻找一种方法来实现这一点,但没有找到。我认为这被保存在某个地方的内存中,如果有任何方法可以找到在哪里,阅读颜色应该很容易......

甜点

总结到目前为止评论中的信息:

看起来唯一能始终如一地做到这一点的方法是用不同的颜色打印一个包含 █ 个字符的屏幕,然后从中提取颜色。由于该项目应该是跨三个主要操作系统的跨平台,并且由于 Linux 目前在用户使用时有 3 个显示管理器,而 Windows 有两个(7 和 8)我只能想象几个小时和几个小时的乐趣将会 :)

所以我的“解决方案”™ 只是破坏用户的颜色(如果他们有系统默认值以外的任何东西......让我们面对它非常罕见)。我将提供一个设置文件,用户可以告诉插件如果他们对系统默认设置不满意,应该恢复哪些颜色。务实而无聊,但它让我再次这样做:)

4

1 回答 1

1

[编辑 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;

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
    }
于 2013-10-28T18:48:22.670 回答