gpt4 book ai didi

c++ - 读取控制台调色板的 RGB 值

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:18:04 24 4
gpt4 key购买 nike

肉类

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

土 bean

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

现在我的目标是使用 ANSI 转义序列以客户端方式执行此操作。但由于我找不到如何获得颜色,所以我开始考虑用 C 或 C++ 代替。

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

酱汁

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

甜点

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

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

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

最佳答案

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

关于c++ - 读取控制台调色板的 RGB 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19230947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com