读取控制台调色板的RGB值

时间:2013-10-07 17:21:58

标签: c++ c console-application xterm ansi-colors

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

马铃薯

这个例子是我想定义自己的颜色(使用ANSI转义序列,如\e]4;3;rgb:cc/78/33\e\\,或直接在c)但我需要在重新定义之前保存用户颜色(不太可能)事件,他们已经重新定义了他们的颜色),以便我可以在我的程序完成后恢复它们。 Clobbering用户设置不是很好。

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

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

的调味汁

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

甜品

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

看起来一直这样做的唯一方法就是打印出不同颜色的█个字符的屏幕并抓住它的颜色。由于这个项目应该是三个主要操作系统的跨平台,并且因为Linux目前在用户上有3个显示管理器,他们使用的方式和windows有两个(7和8)我只能想象有趣的小时和小时将是:)

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

1 个答案:

答案 0 :(得分: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
    }
相关问题