当前位置: 首页 > 科技观察

FreeDOS16种颜色的由来

时间:2023-03-14 22:54:41 科技观察

如果你仔细研究过FreeDOS,你可能已经注意到文本使用的颜色范围有限——16种文本颜色和8种背景颜色。这类似于Linux显示文本颜色的方式——您可以在Linux终端中更改文本颜色,但您仍然限于16种文本颜色和8种背景颜色。DOS文本有16种颜色和8种背景颜色(JimHall,CC-BYSA4.0)为什么文本只能使用这些有限的颜色显示,为什么FreeDOS使用这些颜色和阴影,而不使用其他颜色?与技术中的许多事情一样,答案是历史原因。PC颜色的由来为了解释为什么文本只有16种颜色,让我告诉您第一台IBM个人计算机的故事。这个故事的某些部分可能是人为设计的,但基本原理已经足够接近了。IBM于1981年发布了PersonalComputer5150(“IBMPC”)。该PC使用简单的显示器屏幕,以绿色显示文本。因为这种显示器只适合一种颜色,所以称为单色(“IBM5151MonochromeDisplay”,配备IBMMonochromeDisplayAdapter,即MDA)。同年,IBM发布了PC的更新版本,具有惊人的技术壮举——色彩!新的IBM5153彩色显示器依赖于新的IBM彩色图形适配器(CGA)。正是由于这个原始的CGA,所有DOS文本都继承了它们的颜色。但在我们开始那部分之前,我们首先需要了解一些关于颜色的事情。当我们谈论计算机屏幕上的颜色时,我们谈论的是混合三种原色(红色、绿色和蓝色)的不同值。您可以将不同级别(“亮度”)的红色、绿色和蓝色光混合在一起,以创建几乎任何颜色。混合红光和蓝光,你会得到洋红色。混合蓝色和绿色,你会得到蓝绿色或浅绿色。将所有颜色混合均匀,你会得到白色。没有任何光色,你会看到黑色(没有颜色)。混合红色、绿色和蓝色光以获得不同的颜色(JimHall,CC-BYSA4.0)IBM5153彩色显示器通过点亮微小的红色、绿色和蓝色光点来向用户呈现颜色。这些点非常紧密地排列在一起,并排列成红色、绿色和蓝色点的图案,构成一个“像素”。IBM5153彩色显示器可以通过控制同时点亮哪些荧光点来显示不同颜色的像素。每个红色、绿色和蓝色三元组都是一个像素(JimHall,CC-BYSA4.0)顺便说一句,即使是现代显示器也使用这种红色、绿色和蓝色点组合来表示颜色。现代计算机的不同之处在于每个像素都使用红色、绿色和蓝色LED灯(通常并排排列),而不是微小的荧光点。计算机可以打开或关闭每个LED灯以混合每个像素中的红色、绿色和蓝色。每个红色、绿色和蓝色三元组都是一个像素(JimHall,CC-BYSA4.0)定义CGA颜色IBM工程师意识到他们可以混合红色、绿色和蓝色像素以显示多种颜色。在最简单的情况下,您可以假设单个像素中的每个红色、绿色和蓝色点都处于“开”或“关”状态。正如任何计算机程序员都会告诉您的那样,您可以将“开”和“关”表示为二进制形式——1(1=开)和0(0=关)。对红色、绿色和蓝色使用1或0意味着您最多可以组合八种颜色,从000(红色、绿色和蓝色全部关闭)到111(红色、绿色和蓝色全部打开)。注意位图就像“RGB”,所以RGB=001是蓝色(只有蓝色亮),RGB=011是青色(绿色和蓝色都亮):颜色代码名称000黑色001蓝色010绿色011青色100Red101Magenta110Yellow111White但是这只是最简单的情况。一位特别聪明的IBM工程师意识到,只需再添加一个,就可以将颜色的数量从8种增加到16种。因此,我们可以使用像iRGB这样的位模式,而不是像RGB这样的位模式。我们将这个额外的“i”位称为“强度”位,因为如果我们将“强度”位设置为1(开),那么我们将以全亮度点亮红色、绿色和蓝色;如果“Intensity”位为0(关闭),我们可以使用一些中级亮度。通过这个简单的修复,CGA现在可以显示16种颜色!为简单起见,IBM工程师将高强度颜色称为常规颜色名称的“明亮”版本。所以“红色”与“亮红色”配对,“洋红色”与“亮洋红色”配对。颜色代码名称颜色代码名称0000黑色1000亮黑色0001蓝色1001亮蓝色0010绿色1010亮绿色0011青色1011亮青色0100红色1100亮红色0101洋红色1101亮洋红色0110黄色1110亮黄色0111白色1111亮白色哦不等。等待!这实际上不是十六种颜色。如果您注意到iRGB=0000(黑色)和iRGB=1000(亮黑色),它们都是相同的黑色。没有颜色可以“亮”,所以都是纯黑色。这意味着我们只有15种颜色,而不是我们希望的16种。但是IBM有聪明的工程师为他们工作,他们意识到如何解决这个问题以获得16种颜色。IBM实际上并没有实现直接的RGB到iRGB,而是实现了类似iRGB的方案。通过这一变化,IBM为每个灯点设置了四个亮度级别:完全关闭、三分之一亮度、三分之二亮度和全亮度。如果“亮度”位关闭,则每个红色、绿色和蓝色点将以三分之二的亮度点亮。如果打开“亮度”位,则RGB颜色中的所有0将以三分之一的亮度点亮,而所有1将以全亮度点亮。让我用另一种方式向您描述这一点,使用网络颜色代码。如果你熟悉HTML颜色,你可能知道你可以使用#RGB来表示颜色,其中RGB表示红、绿、蓝值的组合,每个值介于0到F之间的十六进制值。所以,使用IBM的修改了iRGB的定义,iRGB=0001是#00a(蓝色),iRGB=1001是#55f(亮蓝色),因为对于高亮度颜色,RGB=001中的所有零被三除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不得不在某处弄乱了标准名称。颜色代码名称颜色代码名称0000Black1000BrightBlack0001Blue1001BrightBlue0010Green1010BrightGreen0011Cyan1011BrightCyan0100Red1100BrightRed0101Magenta1101BrightMagenta0110Brown1110Yellow0111White1111BrightWhite这是CGA和扩展DOS方式搞定十六种颜色!如果您好奇的话,这也是为什么会有“亮黑色”的原因,尽管它只是一种灰色阴影。表示颜色(位和字节)但是你可能会疑惑:为什么DOS可以显示16种文本颜色而只能显示8种背景颜色?为此,我们需要快速了解一下计算机如何将颜色信息传递给CGA卡。简而言之,CGA卡希望在一个字节包中对每个字符的文字颜色和背景颜色进行编码,共八位。那么八位是从哪里来的呢?我们刚刚了解了iRGB(四位)如何产生十六种颜色。文本颜色使用iRGB,四位,背景颜色限制为八种低强度颜色(RGB,三位),加起来只有七位。失踪的八分之一在哪里?最后一位可能是为DOS时代最重要的用户界面元素保留的——闪烁文本。虽然现在闪烁的文字可能很烦人,但在整个80年代初期,闪烁的文字是一种表示错误消息等关键信息的友好方式。将这个“闪烁”位添加到三个背景颜色位(RGB)和四个文本颜色位(iRGB)会产生八位或一个字节!计算机喜欢以整字节计数,这使得它成为将颜色(和闪烁)信息传输到计算机的便捷方式。因此,表示颜色(和闪烁)的完整字节是Bbbbffff,其中ffff是文本颜色的iRGB位模式(从0到15),而bbb是低强度RGB位模式背景颜色(从0到7),而B是“闪烁”位。十六种文本颜色和八种背景颜色的限制一直持续到今天。当然,DOS坚持这种颜色组合,但即使是像GNOMETerminal这样的Linux终端仿真器,也仍然限于16种文本颜色和8种背景颜色。当然,Linux终端可能允许您更改使用的特定颜色,但您仍然限于十六种文本颜色和八种背景颜色。为此,您可以感谢DOS和最初的IBMPC。不客气!