Linux中國

FreeDOS 的 16 種顏色的由來

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

![終端顏色](/data/attachment/album/202209/21/173211vkhjyhfgydk9lfjf.png "DOS text comes in 16 colors and 8 background colors")

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 文本都繼承了它們的顏色。

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

![三原色](/data/attachment/album/202209/21/173211pagulp62besyg0s6.png "Mix red, green, and blue light to get different colors")

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

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

![CRT 像素](/data/attachment/album/202209/21/173211ytgt0xoxmxvxo0rt.png "Each red, green, and blue triad is a single pixel")

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

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

![液晶像素](/data/attachment/album/202209/21/173211gg4um8ukozsxq888.png "Each red, green, and blue triad is a single pixel")

每個紅色、綠色和藍色三元組都是一個像素(吉姆·霍爾,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 工程師意識到,只需再添加一點,你就可以將顏色數量從 8 種顏色增加到 16 種。因此,我們可以使用像 iRGB 這樣的位模式,而不是像 RGB 這樣的位模式。我們將把這個額外的「i」位稱為「強度」位,因為如果我們將「強度」位設置為 1(開),那麼我們將在全亮度下點亮紅色、綠色和藍色;如果「強度」位為 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 都將以全亮度點亮。

讓我用另一種方式向你描述這一點,使用 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 配色方案包括紅色、黃色、綠色和藍色——我們可以將其「偽造」為靛藍和紫色,但是我們缺少橙色。遭了!

![彩虹](/data/attachment/album/202209/21/173211prhdq6muh3mp6oo2.jpg "A beautiful rainbow - which unfortunately contains orange ")

一條美麗的彩虹——不幸的是它含有橙色。(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 可以顯示 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: https://opensource.com/article/21/6/freedos-sixteen-colors

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

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


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國