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