原文:計算機只認識0和1但是怎麼表示影像和影視等等眾多應用的? - 知乎 (zhihu.com)
0 和 1 是兩種狀態,看上去沒法表示諸如影像這樣的複雜資訊。但是,題主還記不記得以前那個發明國際象棋的數學家給國王出的難題?在第一格放一粒米,第二格放兩粒米,以後每一格都要放比前一格多一倍的米,直到把 64 格放滿。看起來好像不需要消耗多少米,其實總共需要粒米,即一萬億億粒米,全國乃至全世界的米都不夠用。但這兩者之間有什麼關係呢?米的數量我們都知道是一個和格子位置相關的指數函式,若為格子位置,設所需米粒數為,則。回到二進位制上,一位二進位制能表示 0、1 兩種狀態,兩位二進位制能表示 00、01、10、11 四種狀態,以此類推,位二進位制能表示種狀態。假設有一個 64 位的二進位制序列,那麼其能表達的資訊就有約種。現在是不是覺得影像這種複雜資訊能被計算機所認識,也並不是那麼神秘了?且慢。二進位制碼終究是二進位制碼,永遠是那冷冰冰的 0、1,永遠沒有色彩。那麼,計算機是怎麼識別出影像的呢?這涉及到兩個專業術語:編碼、解碼。讓我用通俗的語言一一解釋給你聽。我們小時候牙牙學語,直到現在能看懂、聽懂絕大部分的漢語。但是,如果聽到一個其他國家的語言,比如德語、法語、日語,有些人能聽懂,有些人只能是變啞巴,甚至瞎猜,以至於解讀出錯誤的資訊。漢語這個語言體系,將我們肉眼看到的物體、方塊字形,以及耳朵聽到的波形特徵統一進行了規定。“一”這個漢字就是讀 yi,你不能讀成 er。再比如,家裡吃飯的地方就叫客廳,而不能叫廚房或者臥室。這種硬性的規定,在計算機術語裡,就叫編碼(code)。漢語這個語言,廣義上說,它是一種編碼,因為它將我們所感知到的原先毫無意義的模擬訊號轉變成有意義的資訊。而計算機裡的編碼,同樣也是將計算機中儲存的原先毫無意義的二進位制序列組合賦予了含義。舉個例子,我們現在創造一種編碼,能夠儲存英文文字資訊。大小寫字母加在一起 52 個,再加上10 個阿拉伯數字,以及若干標點符號、數學符號,那麼,用 7 位二進位制儲存就夠了,因為 7 位二進位制能表達種資訊。但我們不能一棍子打死,萬一以後還要再新增新的文字資訊,不夠用就麻煩了,我還得重新再製作編碼。所以乾脆就多加一位,用 8 位儲存,使得這種編碼具有能表達 256 種資訊的能力。然後,我們再將 8 位二進位制序列按照以下規定來解釋:那麼,當計算機讀取到了下面這一串本無意義的二進位制序列時:01001000 01100101 01101100 01101100 01101111 00100001它根據這套編碼規則,就將其解釋成了下面這個(對我們地球人而言)有意義的句子:Hello!這套編碼就是計算機界大名鼎鼎的 ASCII 碼(ASCII Code)。而以上的根據一定的編碼規則對二進位制序列進行解釋的過程叫做解碼(decode)。解碼的載體叫做解碼器(decoder)。我們學會了漢語,也就等同於我們的腦子中儲存了漢語的解碼器,所以我們能聽懂也能表達漢語。而對於日語,當你聽到日語中的「ただいま」(讀音是 TA DA I MA)這個詞的時候,學過日語的就知道這是“我回來了”的意思,而沒學過日語的,可能就會理解成照搬漢語音的“他大姨媽”,甚至是不知所以的“臥槽,這什麼鬼”,也就是,腦子裡沒有儲存這些語言的解碼器,所以自然也就無法解碼,得到的要麼是(在他們看來)沒有意義的模擬音訊訊號(即“臥槽這什麼鬼”),要麼是用錯誤的解碼器解出的亂碼(即“他大姨媽”)。計算機中的文字閱讀器,正是因為帶上了 ASCII 碼的解碼器,才得以成功解碼這個二進位制序列。ASCII 碼只用到了 8 位二進位制中的低 7 位,最高位沒有用到。等到計算機也普及到了世界各地,為了多語言的需要,原本的 ASCII 碼顯然不夠用了,計算機界在原先 ASCII 碼的基礎上又發展出了多套文字編碼。首先是 ISO8859 碼,直接在原先的 ASCII 碼上擴充套件,仍然是 8 位二進位制表示一種文字資訊,它在原先 ASCII 碼的基礎上增加了歐洲的一些文字元號。再到後來,計算機普及到了亞洲地區,而亞洲及中東特有的文字系統讓 ISO8859 無能為力,最開始是各地方自造編碼,比如中國大陸的 GBK 碼,臺灣的 Big5 碼,日本的 Shift-JIS 碼等,他們都佔用了 ASCII 碼的擴充套件部分,並且和 ASCII 碼標準部分相容。因為 ISO8859 碼也用到了 ASCII 碼的擴充套件部分,所以很明顯,這幾套編碼都不與 ISO8859 碼相容,而且彼此也不相容(僅有共用 ASCII 的部分相容)。再後來,世界性的交流越來越多,統一文字編碼勢在必行,這就誕生了 UTF-8 碼,世界上所有的文字資訊在 UTF-8 中都能找到一席之地。扯遠了,話說回來,文字資訊的表達方式我們已經知道了,那麼對於圖片資訊呢?圖片裡有兩種基本資訊:解析度、顏色。我們小時候都學過,太陽雖然看上去是金黃色,但實際上它是由七種顏色組成的。但我們看光譜就知道,這裡的七種是肉眼可分辨的大體上的七種,實際上可以說是無數種。光學上,顏色透過疊加可以生成其他顏色。那麼,有沒有那麼幾種顏色,透過他們任意形式的疊加就能生成所有的顏色呢?實際上是有的。光學中,有個概念叫做三基色,它們是紅、綠、藍。它們的特點是,不可以被其他的顏色組合形成,同時它們三者以任意亮度組合,可以生成肉眼可見的所有顏色。根據光學裡的這個特性,計算機中,對於顏色資訊,自然也就按照紅綠藍亮度值的方式儲存。我們現在將紅綠藍的亮度範圍依次等分成 256 份,這樣一個 8 位二進位制序列就能表示紅、綠、藍三者之一的亮度值,那麼每 24 位二進位制就能表示一種顏色,這樣算下來,一共可以表示種顏色,肉眼足夠了。這就是 RGB 模型(RGB Module),R、G、B 分別對應英語中的 Red、Green、Blue,它們統一叫做通道(channel)。如果 R、G、B 這三個通道分別表示一個維度,那麼這個模型就是一個立方體,它看起來是這個樣子:注:x、y、z 軸上的數表示的是相對滿量程的佔比,所以其範圍都是 0~1,而不是 0~255。那麼,從宏觀到微觀,一副影像,我們可以認為是由一定數量的帶有 RGB 顏色資訊的點的矩陣構成的。這樣的點就叫做畫素(pixel)。而這個畫素矩陣的大小就叫做影像的解析度(resolution)。在計算機的世界裡,影像就是由某個固定的解析度的 RGB 畫素矩陣組成的。這些 RGB 元素,加上一些影像說明資訊(如作者、影像解析度大小等),就構成了影像的編碼。看圖軟體將影像編碼進行解碼,得到 RGB 矩陣,然後這些矩陣資訊給螢幕,螢幕根據驅動程式給定的螢幕資訊(也就是 RGB 矩陣)投射相應亮度的紅、綠、藍的鐳射到螢幕上的每一個點,這就形成了我們所看到的影像。常見的業界標準影像編碼有 JPEG, PNG,以及專用於網頁的 GIF 等,它們的編碼規則受專利保護,這裡不做說明。聲音,同樣有自己的編碼。因為聲音本質是波形,波形就有瞬時頻率,那麼將這些瞬時頻率值按照一定的編碼規則寫成二進位制序列,就形成了聲音檔案。可瞬時是數學中的極限概念,計算機中只能用一個足夠小的時間來表示瞬時,比如說,規定一個 1/22050 秒是一個瞬時,那麼 1 秒鐘就是 22050 個瞬時,也就是 1 秒鐘能記錄 22050 個瞬時頻率。這就是聲音的取樣率(the audio's sample rate),很明顯,這個聲音檔案的取樣率是 22.05kHz。取樣率越高,聲音就越逼真,但同時佔用的儲存空間也越大。另外,編碼格式方面,常見的聲音格式有 AAC、CDA、MP3、WAV、WMA 等。對於影片,它由影像序列以及聲音組合而成,並且按照一定的頻率進行重新整理(比如,一秒重新整理 24 副影像)。這是利用了人的視覺暫留效應,讓人感覺到畫面在動,實際上它仍然是由靜態影像拼接而成的。影片的編碼,早期大家獨立發展,留下了後患,即便到了現代世界,也有 3GP、AVI、FLV、MKV、MP4、RMVB 等超多種編碼格式。文字、影像、聲音、影片等在計算機中儲存的,對人體感官有意義的,有業界編碼標準的二進位制序列資訊統稱為多媒體資訊(multimedia information)。計算機雖然只認識 0 和 1,但由於各類多媒體資訊的解碼器的存在,計算機也就讀懂了這些 0 和 1 的含義。