FreeDOS 的 16 種顏色的由來 | Linux 中國

語言: CN / TW / HK

為什麼文字只能使用這些有限的顏色顯示,為什麼 FreeDOS 使用這些顏色和陰影,而不是其他顏色?答案就像技術中的許多事情一樣,歷史原因。

(本文字數:5387,閱讀時長大約:8 分鐘)

如果你仔細瞭解過 FreeDOS,你可能已經注意到文字使用有限的顏色範圍 —— 16 種文字顏色和 8 種背景顏色。這類似於 Linux 顯示文字顏色的方式 —— 你或許能夠在 Linux 終端中更改 文字顏色 ,但你仍然只能使用 16 種文字顏色和 8 種背景顏色。

DOS 文字有 16 種顏色和 8 種背景顏色(吉姆·霍爾,CC-BY SA 4.0)

為什麼文字只能使用這些有限的顏色顯示,為什麼 FreeDOS 使用這些顏色和陰影,而不是其他顏色?

答案就像技術中的許多事情一樣,歷史原因。

PC 色彩的由來

為了解釋為什麼文字只有 16 種顏色,讓我給你講一個關於第一臺 IBM 個人計算機的故事。這個故事的部分內容可能有些杜撰,但基本內容已經足夠接近。

IBM 於 1981 年釋出了 個人計算機(Personal Computer) 5150(“IBM PC”)。該 PC 使用了一個簡單的監視器螢幕,以綠色顯示文字。由於此顯示器僅適用於一種顏色,因此被稱為 單色(monochrome) (“IBM 5151 單色顯示器”,搭載 IBM 單色顯示介面卡(Monochrome Display Adapter) ,即 MDA)。

同年,IBM 釋出了 PC 的更新版本,帶來了驚人的技術成就 —— 顏色!新的 IBM 5153 彩色顯示器依賴於新的 IBM 彩色圖形介面卡(Color Graphics Adapter) (CGA)。正是由於這個原始的 CGA,所有的 DOS 文字都繼承了它們的顏色。

但在我們討論那一部分之前,我們首先需要了解一些關於顏色的東西。當我們談論計算機螢幕上的顏色時,我們談論的是混合 三原色 (紅色、綠色和藍色)的不同值。你可以將不同級別(“亮度”)的紅光、綠光和藍光混合在一起,以建立幾乎任何顏色。混合紅色和藍色光,你會得到洋紅色。混合藍色和綠色,你會得到青色或淺綠色。均勻地混合所有顏色,你會得到白色。沒有任何淺色,你會看到黑色(沒有顏色)。

混合紅色、綠色和藍色光以獲得不同的顏色(吉姆·霍爾,CC-BY SA 4.0)

IBM 5153 彩色顯示器通過在 陰極射線管(cathode ray tube) (CRT)上點亮微小的紅色、綠色和藍色光點來向用戶呈現顏色。這些小點排列得非常緊密,並以紅色、綠色和藍色的三色點組成一個“畫素”的模式排列。通過控制同時點亮哪些熒光點,IBM 5153 彩色顯示器可以顯示不同顏色的畫素。

每個紅色、綠色和藍色三元組都是一個畫素(吉姆·霍爾,CC-BY SA 4.0)

順便說一句,即使是現代顯示器也使用這種紅色、綠色和藍色點的組合來表示顏色。現代計算機的不同之處在於,每個畫素都使用紅色、綠色和藍色 LED 燈(通常並排排列),而不是微小的熒光點。計算機可以開啟或關閉每個 LED 燈,以混合每個畫素中的紅色、綠色和藍色。

每個紅色、綠色和藍色三元組都是一個畫素(吉姆·霍爾,CC-BY SA 4.0)

定義 CGA 顏色

IBM 工程師意識到他們可以通過混合紅色、綠色和藍色畫素來顯示多種顏色。在最簡單的情況下,你可以假設單個畫素中的每個紅色、綠色和藍色點要麼“開”,要麼“關”。正如任何計算機程式設計師都會告訴你的那樣,你可以將“開”和“關”表示為二進位制 —— 1(1 = 開)和 0(0 = 關)。

用 1 或 0 表示紅色、綠色和藍色意味著你可以組合多達八種顏色,從 000(紅色、綠色和藍色都關閉)到 111(紅色、綠色和藍色都開啟)。請注意,位模式類似於“RGB”,因此 RGB=001 是藍色的(只有藍色是開啟的),RGB=011 是青色的(綠色和藍色都打開了):

但這只是最簡單的情況。一位特別聰明的 IBM 工程師意識到,只需再新增一點,你就可以將顏色數量從 8 種顏色增加到 16 種。因此,我們可以使用像 iRGB 這樣的位模式,而不是像 RGB 這樣的位模式。我們將把這個額外的“i”位稱為“強度”位,因為如果我們將“強度”位設定為 1(開),那麼我們將在全亮度下點亮紅色、綠色和藍色;如果“強度”位為 0(關閉),我們可以使用一些中級亮度。

有了這個簡單的修復程式,現在 CGA 可以顯示 16 種顏色!為了簡單起見,IBM 工程師將高強度顏色稱為常規顏色名稱的“明亮”版本。因此,“紅色”與“亮紅色”配對,“洋紅色”與“亮洋紅色”配對。

哦不,等等!這實際上不是十六種顏色。如果你注意到 iRGB=0000(黑色)和 iRGB=1000(亮黑色),它們都是相同的 黑色 。沒有顏色可以“亮”,所以它們都是普通的黑色。這意味著我們只有 15 種顏色,而不是我們希望的 16 種顏色。

但 IBM 有聰明的工程師為他們工作,他們意識到如何解決這個問題以獲得 16 種顏色。IBM 實際上沒有實現直接的 RGB 到 iRGB,而是實現了 iRGB 方案。隨著這一變化,IBM 為每個光點設定了四個亮度級別:完全關閉、三分之一亮度、三分之二亮度和全亮度。如果“亮度”位被關閉,那麼每個紅色、綠色和藍色光點將以三分之二的亮度點亮。如果你開啟“亮度”位,RGB 顏色中的所有 0 都將以三分之一的亮度點亮,而所有 1 都將以全亮度點亮。

讓我用另一種方式向你描述這一點,使用 Web 顏色程式碼表示。如果你熟悉 HTML 顏色,你可能知道你可以使用 #RGB 表示顏色,其中 RGB 表示紅色、綠色和藍色值的組合,每個值都在十六進位制值 0 到 F 之間。因此,使用 IBM 修改後的 iRGB 定義,iRGB=0001 是 #00a(藍色),iRGB=1001 是 #55f(亮藍色),因為對於高亮度顏色,RGB=001 中的所有零點都以三分之一的亮度點亮(0 到 F 刻度上的“5”左右),RGB=001 中的所有零點都以三分之二的亮度點亮(0 到 F刻度上的“A”)。

有了這些顏色,我們終於完成了!我們擁有從 iRGB=0000(黑色)到 iRGB=1111(亮白色)以及介於兩者之間的所有顏色的全光譜。就像彩虹般的顏色,這很漂亮。

除了……不,等等,這裡有問題!我們實際上還不能複製彩虹的所有顏色。我們在小學學到的方便的助記符是 ROYGBIV,它可以幫助我們記住彩虹的顏色有紅色、橙色、黃色、綠色、藍色、靛藍和紫色。我們修改後的 iRGB 配色方案包括紅色、黃色、綠色和藍色——我們可以將其“偽造”為靛藍和紫色,但是我們缺少橙色。遭了!

一條美麗的彩虹——不幸的是它含有橙色。(Paweł Fijałkowski,公共)

為了解決這個問題,聰明的 IBM 工程師對 RGB=110 做了最後的修復。高強度顏色(iRGB=1110)以全亮度點亮紅色和綠色熒光粉點以產生黃色,但是在低亮度顏色(iRGB=0110)下,他們以三分之二的亮度點亮紅色,以三分之一的亮度點亮綠色。這將 iRGB=0110 變成了橙色——儘管它後來被稱為“棕色”,因為 IBM 不得不在某處弄亂標準名稱。

這就是 CGA 以及擴充套件的 DOS 獲得十六種顏色的方式!如果你好奇,這也是為什麼會有“亮黑色”的原因,即使它只是一種灰色陰影。

表示顏色(位和位元組)

但是你可能想知道:為什麼 DOS 可以顯示 16 種文字顏色,卻只能顯示 8 種背景顏色?為此,我們需要快速瞭解計算機如何將顏色資訊傳遞給 CGA 卡。

簡而言之,CGA 卡希望將每個字元的文字顏色和背景顏色編碼在一個位元組資料包中,一共八位。那麼八位是從哪裡來的呢?

我們剛剛瞭解了 iRGB(四位)如何生成十六種顏色。文字顏色使用 iRGB ,四位,背景顏色僅限於八種低強度顏色(RGB,三位),加起來只有七位。丟失的第八位在哪裡?

最後一個位可能是為 DOS 時代最重要的使用者介面元素保留的 —— 閃爍文字。雖然閃爍的文字在如今可能很煩人,但在整個 1980 年代初期,閃爍的文字是表示錯誤訊息等關鍵資訊的友好方式。

將這個“閃爍”位新增到三個背景顏色位(RGB)和四個文字顏色位(iRGB)中會產生八個位或一個位元組!計算機喜歡以完整位元組為單位進行計數,這使其成為將顏色(和閃爍)資訊傳輸到計算機的便捷方式。

因此,表示顏色(和閃爍)的完整位元組是 Bbbbffff ,其中 ffff 是文字顏色的 iRGB 位模式(從 0 到 15), bbb 是低強度的 RGB 位模式背景顏色(從 0 到 7),而 B 是“閃爍”位。

十六種文字顏色和八種背景顏色的限制一直持續到今天。當然,DOS 堅持使用這種顏色組合,但即使是像 GNOME 終端這樣的 Linux 終端模擬器也仍然受限於 16 種文字顏色和 8 種背景顏色。當然,Linux 終端可能允許你更改使用的特定顏色,但你仍然限於十六種文字顏色和八種背景顏色。為此,你要感謝 DOS 和最初的 IBM PC。別客氣!

via: http:// opensource.com/article/ 21/6/freedos-sixteen-colors

作者:Jim Hall 選題: lujun9972 譯者: gpchn 校對: wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出