FreeDOS 的 16 種顏色的由來(lái)
如果你仔細(xì)了解過(guò) FreeDOS,你可能已經(jīng)注意到文本使用有限的顏色范圍 —— 16 種文本顏色和 8 種背景顏色。這類似于 Linux 顯示文本顏色的方式 —— 你或許能夠在 Linux 終端中更改 文本顏色,但你仍然只能使用 16 種文本顏色和 8 種背景顏色。
DOS 文本有 16 種顏色和 8 種背景顏色(吉姆·霍爾,??CC-BY SA 4.0??)
為什么文本只能使用這些有限的顏色顯示,為什么 FreeDOS 使用這些顏色和陰影,而不是其他顏色?
答案就像技術(shù)中的許多事情一樣,歷史原因。
PC 色彩的由來(lái)
為了解釋為什么文本只有 16 種顏色,讓我給你講一個(gè)關(guān)于第一臺(tái) IBM 個(gè)人計(jì)算機(jī)的故事。這個(gè)故事的部分內(nèi)容可能有些杜撰,但基本內(nèi)容已經(jīng)足夠接近。
IBM 于 1981 年發(fā)布了個(gè)人計(jì)算機(jī)Personal Computer 5150(“IBM PC”)。該 PC 使用了一個(gè)簡(jiǎn)單的監(jiān)視器屏幕,以綠色顯示文本。由于此顯示器僅適用于一種顏色,因此被稱為 單色monochrome(“IBM 5151 單色顯示器”,搭載 IBM 單色顯示適配器Monochrome Display Adapter,即 MDA)。
同年,IBM 發(fā)布了 PC 的更新版本,帶來(lái)了驚人的技術(shù)成就 —— 顏色!新的 IBM 5153 彩色顯示器依賴于新的 IBM 彩色圖形適配器Color Graphics Adapter(CGA)。正是由于這個(gè)原始的 CGA,所有的 DOS 文本都繼承了它們的顏色。
但在我們討論那一部分之前,我們首先需要了解一些關(guān)于顏色的東西。當(dāng)我們談?wù)撚?jì)算機(jī)屏幕上的顏色時(shí),我們談?wù)摰氖腔旌?nbsp;三原色(紅色、綠色和藍(lán)色)的不同值。你可以將不同級(jí)別(“亮度”)的紅光、綠光和藍(lán)光混合在一起,以創(chuàng)建幾乎任何顏色。混合紅色和藍(lán)色光,你會(huì)得到洋紅色。混合藍(lán)色和綠色,你會(huì)得到青色或淺綠色。均勻地混合所有顏色,你會(huì)得到白色。沒(méi)有任何淺色,你會(huì)看到黑色(沒(méi)有顏色)。
混合紅色、綠色和藍(lán)色光以獲得不同的顏色(吉姆·霍爾,??CC-BY SA 4.0??)
IBM 5153 彩色顯示器通過(guò)在陰極射線管cathode ray tube(CRT)上點(diǎn)亮微小的紅色、綠色和藍(lán)色光點(diǎn)來(lái)向用戶呈現(xiàn)顏色。這些小點(diǎn)排列得非常緊密,并以紅色、綠色和藍(lán)色的三色點(diǎn)組成一個(gè)“像素”的模式排列。通過(guò)控制同時(shí)點(diǎn)亮哪些熒光點(diǎn),IBM 5153 彩色顯示器可以顯示不同顏色的像素。
每個(gè)紅色、綠色和藍(lán)色三元組都是一個(gè)像素(吉姆·霍爾,??CC-BY SA 4.0??)
順便說(shuō)一句,即使是現(xiàn)代顯示器也使用這種紅色、綠色和藍(lán)色點(diǎn)的組合來(lái)表示顏色。現(xiàn)代計(jì)算機(jī)的不同之處在于,每個(gè)像素都使用紅色、綠色和藍(lán)色 LED 燈(通常并排排列),而不是微小的熒光點(diǎn)。計(jì)算機(jī)可以打開(kāi)或關(guān)閉每個(gè) LED 燈,以混合每個(gè)像素中的紅色、綠色和藍(lán)色。
每個(gè)紅色、綠色和藍(lán)色三元組都是一個(gè)像素(吉姆·霍爾,??CC-BY SA 4.0??)
定義 CGA 顏色
IBM 工程師意識(shí)到他們可以通過(guò)混合紅色、綠色和藍(lán)色像素來(lái)顯示多種顏色。在最簡(jiǎn)單的情況下,你可以假設(shè)單個(gè)像素中的每個(gè)紅色、綠色和藍(lán)色點(diǎn)要么“開(kāi)”,要么“關(guān)”。正如任何計(jì)算機(jī)程序員都會(huì)告訴你的那樣,你可以將“開(kāi)”和“關(guān)”表示為二進(jìn)制 —— 1(1 = 開(kāi))和 0(0 = 關(guān))。
用 1 或 0 表示紅色、綠色和藍(lán)色意味著你可以組合多達(dá)八種顏色,從 000(紅色、綠色和藍(lán)色都關(guān)閉)到 111(紅色、綠色和藍(lán)色都打開(kāi))。請(qǐng)注意,位模式類似于“RGB”,因此 RGB=001 是藍(lán)色的(只有藍(lán)色是打開(kāi)的),RGB=011 是青色的(綠色和藍(lán)色都打開(kāi)了):
顏色 | 代碼 | 名稱 |
000 | 黑 | |
001 | 藍(lán) | |
010 | 綠 | |
011 | 青 | |
100 | 紅 | |
101 | 洋紅 | |
110 | 黃 | |
111 | 白 |
但這只是最簡(jiǎn)單的情況。一位特別聰明的 IBM 工程師意識(shí)到,只需再添加一點(diǎn),你就可以將顏色數(shù)量從 8 種顏色增加到 16 種。因此,我們可以使用像 iRGB 這樣的位模式,而不是像 RGB 這樣的位模式。我們將把這個(gè)額外的“i”位稱為“強(qiáng)度”位,因?yàn)槿绻覀儗ⅰ皬?qiáng)度”位設(shè)置為 1(開(kāi)),那么我們將在全亮度下點(diǎn)亮紅色、綠色和藍(lán)色;如果“強(qiáng)度”位為 0(關(guān)閉),我們可以使用一些中級(jí)亮度。
有了這個(gè)簡(jiǎn)單的修復(fù)程序,現(xiàn)在 CGA 可以顯示 16 種顏色!為了簡(jiǎn)單起見(jiàn),IBM 工程師將高強(qiáng)度顏色稱為常規(guī)顏色名稱的“明亮”版本。因此,“紅色”與“亮紅色”配對(duì),“洋紅色”與“亮洋紅色”配對(duì)。
顏色 | 代碼 | 名稱 | 顏色 | 代碼 | 名稱 |
0000 | 黑 | 1000 | 亮黑 | ||
0001 | 藍(lán) | 1001 | 亮藍(lán) | ||
0010 | 綠 | 1010 | 亮綠 | ||
0011 | 青 | 1011 | 亮青 | ||
0100 | 紅 | 1100 | 亮紅 | ||
0101 | 洋紅 | 1101 | 亮洋紅 | ||
0110 | 黃 | 1110 | 亮黃 | ||
0111 | 白 | 1111 | 亮白 |
哦不,等等!這實(shí)際上不是十六種顏色。如果你注意到 iRGB=0000(黑色)和 iRGB=1000(亮黑色),它們都是相同的 黑色。沒(méi)有顏色可以“亮”,所以它們都是普通的黑色。這意味著我們只有 15 種顏色,而不是我們希望的 16 種顏色。
但 IBM 有聰明的工程師為他們工作,他們意識(shí)到如何解決這個(gè)問(wèn)題以獲得 16 種顏色。IBM 實(shí)際上沒(méi)有實(shí)現(xiàn)直接的 RGB 到 iRGB,而是實(shí)現(xiàn)了 類 iRGB 方案。隨著這一變化,IBM
為每個(gè)光點(diǎn)設(shè)置了四個(gè)亮度級(jí)別:完全關(guān)閉、三分之一亮度、三分之二亮度和全亮度。如果“亮度”位被關(guān)閉,那么每個(gè)紅色、綠色和藍(lán)色光點(diǎn)將以三分之二的亮度點(diǎn)亮。如果你打開(kāi)“亮度”位,RGB
顏色中的所有 0 都將以三分之一的亮度點(diǎn)亮,而所有 1 都將以全亮度點(diǎn)亮。
讓我用另一種方式向你描述這一點(diǎn),使用 Web 顏色代碼表示。如果你熟悉 HTML 顏色,你可能知道你可以使用 ??#RGB?
? 表示顏色,其中 RGB 表示紅色、綠色和藍(lán)色值的組合,每個(gè)值都在十六進(jìn)制值 0 到 F 之間。因此,使用 IBM 修改后的 iRGB 定義,iRGB=0001 是 #00a(藍(lán)色),iRGB=1001 是 #55f(亮藍(lán)色),因?yàn)閷?duì)于高亮度顏色,RGB=001 中的所有零點(diǎn)都以三分之一的亮度點(diǎn)亮(0 到 F 刻度上的“5”左右),RGB=001 中的所有零點(diǎn)都以三分之二的亮度點(diǎn)亮(0 到 F刻度上的“A”)。
顏色 | 代碼 | 名稱 | 顏色 | 代碼 | 名稱 |
0000 | 黑 | 1000 | 亮黑 | ||
0001 | 藍(lán) | 1001 | 亮藍(lán) | ||
0010 | 綠 | 1010 | 亮綠 | ||
0011 | 青 | 1011 | 亮青 | ||
0100 | 紅 | 1100 | 亮紅 | ||
0101 | 洋紅 | 1101 | 亮洋紅 | ||
0110 | 黃 | 1110 | 亮黃 | ||
0111 | 白 | 1111 | 亮白 |
有了這些顏色,我們終于完成了!我們擁有從 iRGB=0000(黑色)到 iRGB=1111(亮白色)以及介于兩者之間的所有顏色的全光譜。就像彩虹般的顏色,這很漂亮。
除了……不,等等,這里有問(wèn)題!我們實(shí)際上還不能復(fù)制彩虹的所有顏色。我們?cè)谛W(xué)學(xué)到的方便的助記符是
ROYGBIV,它可以幫助我們記住彩虹的顏色有紅色、橙色、黃色、綠色、藍(lán)色、靛藍(lán)和紫色。我們修改后的 iRGB
配色方案包括紅色、黃色、綠色和藍(lán)色——我們可以將其“偽造”為靛藍(lán)和紫色,但是我們?nèi)鄙俪壬T饬耍?/p>
一條美麗的彩虹——不幸的是它含有橙色。(??Pawe? Fija?kowski???,公共)
為了解決這個(gè)問(wèn)題,聰明的 IBM 工程師對(duì) RGB=110 做了最后的修復(fù)。高強(qiáng)度顏色(iRGB=1110)以全亮度點(diǎn)亮紅色和綠色熒光粉點(diǎn)以產(chǎn)生黃色,但是在低亮度顏色(iRGB=0110)下,他們以三分之二的亮度點(diǎn)亮紅色,以三分之一的亮度點(diǎn)亮綠色。這將 iRGB=0110 變成了橙色——盡管它后來(lái)被稱為“棕色”,因?yàn)?IBM 不得不在某處弄亂標(biāo)準(zhǔn)名稱。
顏色 | 代碼 | 名稱 | 顏色 | 代碼 | 名稱 |
0000 | 黑 | 1000 | 亮黑 | ||
0001 | 藍(lán) | 1001 | 亮藍(lán) | ||
0010 | 綠 | 1010 | 亮綠 | ||
0011 | 青 | 1011 | 亮青 | ||
0100 | 紅 | 1100 | 亮紅 | ||
0101 | 洋紅 | 1101 | 亮洋紅 | ||
0110 | 棕 | 1110 | 黃 | ||
0111 | 白 | 1111 | 亮白 |
這就是 CGA 以及擴(kuò)展的 DOS 獲得十六種顏色的方式!如果你好奇,這也是為什么會(huì)有“亮黑色”的原因,即使它只是一種灰色陰影。
表示顏色(位和字節(jié))
但是你可能想知道:為什么 DOS 可以顯示 16 種文本顏色,卻只能顯示 8 種背景顏色?為此,我們需要快速了解計(jì)算機(jī)如何將顏色信息傳遞給 CGA 卡。
簡(jiǎn)而言之,CGA 卡希望將每個(gè)字符的文本顏色和背景顏色編碼在一個(gè)字節(jié)數(shù)據(jù)包中,一共八位。那么八位是從哪里來(lái)的呢?
我們剛剛了解了 iRGB(四位)如何生成十六種顏色。文本顏色使用 iRGB ,四位,背景顏色僅限于八種低強(qiáng)度顏色(RGB,三位),加起來(lái)只有七位。丟失的第八位在哪里?
最后一個(gè)位可能是為 DOS 時(shí)代最重要的用戶界面元素保留的 —— 閃爍文本。雖然閃爍的文本在如今可能很煩人,但在整個(gè) 1980 年代初期,閃爍的文本是表示錯(cuò)誤消息等關(guān)鍵信息的友好方式。
將這個(gè)“閃爍”位添加到三個(gè)背景顏色位(RGB)和四個(gè)文本顏色位(iRGB)中會(huì)產(chǎn)生八個(gè)位或一個(gè)字節(jié)!計(jì)算機(jī)喜歡以完整字節(jié)為單位進(jìn)行計(jì)數(shù),這使其成為將顏色(和閃爍)信息傳輸?shù)接?jì)算機(jī)的便捷方式。
因此,表示顏色(和閃爍)的完整字節(jié)是 ??Bbbbffff?
?,其中 ??ffff?
? 是文本顏色的 iRGB 位模式(從 0 到 15),??bbb?
? 是低強(qiáng)度的 RGB 位模式背景顏色(從 0 到 7),而 ??B?
? 是“閃爍”位。
十六種文本顏色和八種背景顏色的限制一直持續(xù)到今天。當(dāng)然,DOS 堅(jiān)持使用這種顏色組合,但即使是像 GNOME 終端這樣的 Linux 終端仿真器也仍然受限于 16 種文本顏色和 8 種背景顏色。當(dāng)然,Linux 終端可能允許你更改使用的特定顏色,但你仍然限于十六種文本顏色和八種背景顏色。為此,你要感謝 DOS 和最初的 IBM PC。別客氣!