如果您仔细观察过 FreeDOS,您可能已经注意到文本颜色范围有限——16 种文本颜色和 8 种背景颜色。这与 Linux 显示文本颜色的方式类似——您或许可以更改 Linux 终端中使用的文本颜色,但您仍然只能使用 16 种文本颜色和 8 种背景颜色。

DOS 文本有 16 种颜色和 8 种背景颜色
(Jim Hall, CC-BY SA 4.0)
为什么文本只有这么有限的调色板,为什么 FreeDOS 使用这些颜色和色调,而不是其他颜色?答案和技术领域的许多事物一样,都源于历史。
PC 彩色的起源
为了解释为什么文本只有 16 种颜色,让我给您讲一个关于第一台 IBM 个人电脑的故事。故事的某些部分可能有些杜撰,但基本事实是接近的。
IBM 于 1981 年发布了 Personal Computer 5150(“IBM PC”)。PC 使用简单的显示器屏幕,以绿色显示文本。由于这种显示器只能使用一种颜色,因此被称为单色(“IBM 5151 单色显示器”,配备 IBM 单色显示适配器卡,或“MDA”)。
同年,IBM 发布了 PC 的更新版本,该版本拥有一项惊人的技术成就——彩色!新的 IBM 5153 彩色显示器依赖于新的 IBM 彩色图形适配器,或“CGA”。正是由于最初的 CGA,所有 DOS 文本都继承了它们的颜色。
但在我们深入探讨之前,我们首先需要了解一些关于颜色的知识。当我们谈论计算机屏幕上的颜色时,我们谈论的是混合三种原色光——红色、绿色和蓝色——的不同值。您可以混合不同级别(或“亮度”)的红光、绿光和蓝光,以创建几乎任何颜色。仅混合红光和蓝光,您会得到品红色。混合蓝光和绿光,您会得到青色或水蓝色。均匀混合所有颜色,您会得到白色。没有任何色光,您会看到黑色(没有颜色)。

混合红光、绿光和蓝光以获得不同的颜色
(Jim Hall, CC-BY SA 4.0)
IBM 5153 彩色显示器通过点亮阴极射线管(“CRT”)上微小的红色、绿色和蓝色荧光点向用户呈现颜色。这些微小的点非常靠近地排列在一起,并且以红色、绿色和蓝色点三元组形成“像素”的模式排列。通过控制一次点亮哪些荧光点,IBM 5153 彩色显示器可以显示不同颜色的像素。

每个红色、绿色和蓝色三元组都是一个像素
(Jim Hall, CC-BY SA 4.0)
顺便说一句,即使是现代显示器也使用红色、绿色和蓝色点的组合来表示颜色。现代计算机的不同之处在于,每个像素不是使用微小的荧光点,而是使用红色、绿色和蓝色 LED 灯的三元组——通常并排排列。计算机可以打开或关闭每个 LED 灯,以混合每个像素中的红色、绿色和蓝色。

每个红色、绿色和蓝色三元组都是一个像素
(Jim Hall, CC-BY SA 4.0)
定义 CGA 颜色
IBM 工程师意识到,他们可以通过混合每个红色、绿色和蓝色像素来显示多种颜色。在最简单的情况下,您可以假设单个像素中的每个红色、绿色和蓝色点要么是“开”要么是“关”。正如任何计算机程序员都会告诉您的那样,您可以将“开”和“关”表示为二进制——1(1=开)和 0(0=关)。
用 1 或 0 表示红色、绿色和蓝色意味着您可以组合多达八种颜色,从 000(红色、绿色和蓝色都关闭)到 111(红色、绿色和蓝色都打开)。请注意,位模式像“RGB”一样,因此 RGB=001 是蓝色(只有蓝色打开),RGB=011 是青色(绿色和蓝色都打开)
000 黑色 | |
001 蓝色 | |
010 绿色 | |
011 青色 | |
100 红色 | |
101 品红色 | |
110 黄色 | |
111 白色 |
但这只是最简单的情况。一位特别聪明的 IBM 工程师意识到,只需添加一位,就可以将颜色数量从八种翻倍到十六种。因此,我们可以使用像 iRGB 这样的位模式,而不是像 RGB 这样的位模式。我们将这个额外的“i”位称为“强度”位,因为如果我们将“强度”位设置为 1(开),那么我们将以全亮度点亮红色、绿色和蓝色荧光点;如果“强度”位为 0(关),我们可以使用一些中等亮度。
通过这个简单的修复,CGA 现在可以显示十六种颜色了!为了简单起见,IBM 工程师将高强度颜色称为常规颜色名称的“亮”版本。“红色”与“亮红色”配对,“品红色”与“亮品红色”配对。
0000 黑色 | 1000 亮黑色 | ||
0001 蓝色 | 1001 亮蓝色 | ||
0010 绿色 | 1010 亮绿色 | ||
0011 青色 | 1011 亮青色 | ||
0100 红色 | 1100 亮红色 | ||
0101 品红色 | 1101 亮品红色 | ||
0110 黄色 | 1110 亮黄色 | ||
0111 白色 | 1111 亮白色 |
哎呀!等等!这实际上不是十六种颜色。如果您注意到 iRGB=0000(黑色)和 iRGB=1000(亮黑色),它们都是相同的黑色。没有什么颜色可以“亮”,所以它们都只是普通的黑色。这意味着我们只有十五种颜色,而不是我们希望的十六种。
但是 IBM 有聪明的工程师为他们工作,他们意识到如何解决这个问题以获得十六种颜色。IBM 实际上并没有实现直接的 RGB 到 iRGB,而是实现了一种修改后的 iRGB 方案。通过这种更改,IBM 为每个荧光点设置了四个亮度级别:完全关闭、三分之一亮度、三分之二亮度和全亮度。如果“强度”位关闭,那么每个红色、绿色和蓝色荧光点将以三分之二亮度点亮。如果您将“强度”位打开,则 RGB 颜色中的任何零都将以三分之一亮度点亮,而 RGB 颜色中的任何一都将以全亮度点亮。
让我用另一种方式向您描述,使用 Web 颜色代码表示。如果您熟悉 HTML 颜色空间,您可能知道可以使用 #RGB 表示颜色,其中 RGB 表示红色、绿色和蓝色值的组合,每个值介于十六进制值 0 到 F 之间。因此,使用 IBM 修改后的 iRGB 定义,iRGB=0001 是 #00a(蓝色),iRGB=1001 是 #55f(亮蓝色),因为对于高强度颜色,RGB=001 中的所有零都以三分之一亮度(大约在 0 到 F 刻度上的“5”左右)点亮,而 RGB=001 中的所有一都以三分之二亮度(大约在 0 到 F 刻度上的“A”左右)点亮。
0000 黑色 | 1000 亮黑色 | ||
0001 蓝色 | 1001 亮蓝色 | ||
0010 绿色 | 1010 亮绿色 | ||
0011 青色 | 1011 亮青色 | ||
0100 红色 | 1100 亮红色 | ||
0101 品红色 | 1101 亮品红色 | ||
0110 黄色 | 1110 亮黄色 | ||
0111 白色 | 1111 亮白色 |
有了这些颜色,我们终于完成了!我们拥有从 iRGB=0000(黑色)到 iRGB=1111(亮白色)以及介于两者之间的每种颜色的全光谱。就像彩虹的颜色一样,这很美丽。
但是,不。等等。这里有些不对劲。我们实际上还无法复制彩虹的所有颜色。我们在小学学到的方便的助记符是 ROYGBIV,以帮助我们记住彩虹的颜色从红色、橙色、黄色、绿色、蓝色、靛蓝色和紫色。我们修改后的 iRGB 颜色方案包括红色、黄色、绿色和蓝色——我们可以“伪造”靛蓝色和“紫色”。但我们缺少橙色。哎呀!

美丽的彩虹 - 但不幸的是,它包含橙色
(Paweł Fijałkowski, 公共领域)
为了解决这个问题,聪明的 IBM 工程师对 RGB=110 进行了最后一次修复。高强度颜色 (iRGB=1110) 以全亮度点亮红色和绿色荧光点以产生黄色。但在低强度颜色 (iRGB=0110) 下,他们以三分之二亮度点亮红色,以三分之一亮度点亮绿色。这使 iRGB=0110 变成橙色——尽管后来它被称为“棕色”,因为 IBM 不得不在某个地方搞砸标准名称。
0000 黑色 | 1000 亮黑色 | ||
0001 蓝色 | 1001 亮蓝色 | ||
0010 绿色 | 1010 亮绿色 | ||
0011 青色 | 1011 亮青色 | ||
0100 红色 | 1100 亮红色 | ||
0101 品红色 | 1101 亮品红色 | ||
0110 棕色 | 1110 黄色 | ||
0111 白色 | 1111 亮白色 |
这就是 CGA——以及扩展的 DOS——获得十六种颜色的方式!如果您好奇,这也是为什么有“亮黑色”颜色的原因,即使它只是一种灰色。
表示颜色(位和字节)
但您可能想知道:如果 DOS 可以显示十六种文本颜色,为什么它只能显示八种背景颜色?为此,我们需要快速了解一下计算机如何将颜色信息传递给 CGA 卡。
简而言之,CGA 卡期望每个字符的文本颜色和背景颜色都编码在一个字节数据包中。那是八位。那么这八位来自哪里呢?
我们刚刚了解了 iRGB(四位)如何生成十六种颜色。文本颜色使用 iRGB,或四位。背景颜色仅限于八种低强度颜色(RGB 或三位)。加起来只有七位。那么缺少的第八位在哪里?
最后一位被保留用于 DOS 时代最重要的用户界面元素——闪烁文本。虽然今天的闪烁文本可能令人讨厌,但在 1980 年代初期,闪烁文本是表示关键信息(例如错误消息)的友好方式。
将这个“闪烁”位添加到三个背景颜色位 (RGB) 和四个文本颜色位 (iRGB) 中,就构成八位或一个字节!计算机喜欢以完整字节计数,这使其成为将颜色(和闪烁)信息打包到计算机的便捷方式。
因此,表示颜色(和闪烁)的完整字节是 Bbbbffff
,其中 ffff
是文本颜色的 iRGB 位模式(从 0 到 15),bbb
是低强度背景颜色的 RGB 位模式(从 0 到 7),而 B
是“闪烁”位。
十六种文本颜色和八种背景颜色的限制一直延续至今。当然,DOS 受限于此调色板,但即使像 GNOME 终端这样的 Linux 终端模拟器仍然受限于十六种文本颜色和八种背景颜色。当然,Linux 终端可能允许您更改使用的特定颜色,但您仍然仅限于十六种文本颜色和八种背景颜色。为此,您可以感谢 DOS 和最初的 IBM PC。不用客气!
2 条评论