Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取控制台调色板的RGB值 肉 在C或C++中有没有直接读取调色板RGB值的方法?特别有趣的是xterm(和其他人)使用扩展的颜色空间来定义多达256种终端颜色 土豆_C++_C_Console Application_Xterm_Ansi Colors - Fatal编程技术网

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

读取控制台调色板的RGB值 肉 在C或C++中有没有直接读取调色板RGB值的方法?特别有趣的是xterm(和其他人)使用扩展的颜色空间来定义多达256种终端颜色 土豆,c++,c,console-application,xterm,ansi-colors,C++,C,Console Application,Xterm,Ansi Colors,这方面的例子是,我想定义自己的颜色(使用ANSI转义序列,如\e]4;3;rgb:cc/78/33\e\\\,或直接使用c),但我需要在重新定义用户颜色之前保存它们(在不太可能的情况下,他们已经重新定义了颜色),以便在程序完成时恢复它们。重击用户设置是不好的 现在我的目标是使用ANSI转义序列以客户端的方式来实现这一点。但是因为我找不到你是如何得到颜色的,所以我开始在C或C++中做这件事。 该解决方案将被编写为具有本地扩展的Ruby GEM(基本上嵌入C或C++代码),并且我的目标是获得跨平台解

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

现在我的目标是使用ANSI转义序列以客户端的方式来实现这一点。但是因为我找不到你是如何得到颜色的,所以我开始在C或C++中做这件事。

该解决方案将被编写为具有本地扩展的Ruby GEM(基本上嵌入C或C++代码),并且我的目标是获得跨平台解决方案,即使主要目标是OS X和第二Linux环境…

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

甜点 总结目前评论中的信息:

看起来唯一能做到这一点的方法就是打印一个█ 不同颜色的角色,并从中获取颜色。由于这个项目应该是跨平台的,跨越三大操作系统,而且Linux目前在用户界面上有三个显示管理器,并且windows有两个(7个和8个),我只能想象其中的乐趣是:)


所以我的“解决方案”™ 就是把用户的颜色涂得乱七八糟(如果他们有系统默认值以外的东西……让我们面对现实吧,这是非常罕见的)。我将提供一个设置文件,用户可以告诉插件什么颜色应该恢复,如果他们不满意的系统默认值。实用又无聊,但我又开始这样做了:)

[Edit 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;

愚蠢的问题,但是你有没有环顾四周寻找一些相关的问题,这篇文章讨论了几种关于获取区域或整个屏幕的解决方案。我想知道使用类似的东西是否适合您?我已经阅读了关于SO和SuperUser等的所有相关问题。这里的问题是,您处于控制台环境中,因此获取像素值可能不是一个选项,因为您不能依赖于图形环境。我真正想要的是一个转义序列,或者一种直接访问内存中颜色表的方法。但是,这是不可能的:/正如问题中指出的,这是关于保留用户的颜色,而不仅仅是恢复系统默认值。获取默认值的静态映射非常简单:)通过对EGA/VGA的IO访问,您可以从大多数控制台通常使用的256色调色板中分别获取和设置任何颜色。唯一的问题是你是否有IO访问权限…PS。调色板存储在gfx卡上,不在CPU访问的内存空间中,所以这样它就是您想要的内存访问。。。如果控制台未处于文本模式,则仍应模拟256色EGA/VGA模式。如果不是,那么它不是真正的控制台,只是一些模拟,唯一的方法是前面提到的获取屏幕像素(屏幕不是窗口!!!)。在这种情况下,只需写256个不同颜色的字符并读取它们的字体颜色(由于消除混叠需要添加一些过滤),我承认这是一种可行的方法:)这种情况下唯一的问题是,我将其作为Ruby gem编写,然后C/C++代码将编译为本机扩展。我必须在OS X、Linux和Windows上处理这一问题,并承诺在三个操作系统上使用至少6个不同的显示管理器时会很有趣。我真的希望有一个更规范的解决方案,但它可能不存在(在这种情况下,我将在退出时通过恢复系统默认颜色来关闭用户设置:))。如果在您所针对的所有平台中都没有API,那么这可能是唯一的解决方案。对不起,没帮上忙。另外,我发现我的旧asm和pas源IO地址是0x3C8,colorix;然后在r中,0x3C9;在g中,0x3C9;在b中,0x3C9;对于调色板读取或相同,对于调色板集为带输出。
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
    }