神們自己
在我們的日常生活中,掃碼早已普及:付款要掃碼,加微信要掃碼,開會簽到要掃碼……《中國互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計報告》顯示,早在2016年,我國平均每天掃碼就已超過15億次。我們每天都可能接觸二維碼,但似乎很少想過:二維碼究竟是怎樣工作的?那一團亂碼般的黑白圖案中,到底蘊藏著什么樣的秘密?
二維碼圖案看似亂碼,其實是精心設(shè)計的程序化信息。想要了解二維碼的工作原理,我們先要了解“二進制”這個偉大發(fā)明。在計算機的世界中,任何信息都由0和1組成,這就是二進制。任何一個數(shù)字、字母和漢字,都可以轉(zhuǎn)化為二進制形式,例如,十進制的2在二進制中用10表示,大寫字母A在二進制中用01000001表示。任何信息都可以轉(zhuǎn)化為由0和1構(gòu)成的二進制數(shù)字,這種轉(zhuǎn)化方法叫作“編碼”。
計算機只能看懂0和1,于是人類發(fā)明了編碼,使任何信息都可以轉(zhuǎn)換成由0和1組成的二進制數(shù)字。那么,我們怎樣把信息輸入計算機呢?你的第一反應(yīng)可能會是:用鍵盤打字。不過在很多場合下,用鍵盤打字既不方便,也不高效。比如你去超市買東西,結(jié)賬時售貨員需要在極短的時間內(nèi)輸入大量商品的名稱、價格、數(shù)量,如果用鍵盤輸入的話,你身后的隊伍會排很長。實際上,售貨員會用專用的掃描槍掃商品條形碼。條形碼,就是二維碼的前身。
用視覺信號代替鍵盤輸入,是一個了不起的技術(shù)飛躍。條形碼發(fā)明于20世紀20年代,這項100年前的古老技術(shù)如何做到穩(wěn)定快速地讀取信息呢?其實,它的工作原理和我們用機器閱卷的原理相似。
你在考試時肯定涂過答題卡,但你有沒有想過,為什么不能直接寫ABCD,而是要用2B鉛筆把對應(yīng)選項的小方塊涂黑呢?原因就是為了方便機器自動閱卷。每個人手寫的ABCD千奇百怪,通過人工智能做視覺識別無法做到100%的準(zhǔn)確率,即使是人工批卷,也免不了會有看走眼的時候。不過,每個人用2B鉛筆涂黑的小方塊都是一樣的。機器閱卷的基本原理就是用一個掃描器發(fā)射光并接收光,通過測定反射信號,得到二進制數(shù)字。黑色反射光最少,機器識別為1;白色反射光最多,機器識別為0。把你答題卡上涂的小方塊排成一排,就能代表一串0和1組成的數(shù)字:
把上面這張圖縱向拉長,你就得到了一個最原始的條形碼。我們可以把條形碼拆分為一個個小方格,黑色小方格代表1,白色小方格代表0。條形碼中的每一根黑條,就相當(dāng)于答題卡涂黑的一個小方塊,通過黑條和白條之間的間距變化編碼信息。當(dāng)超市售貨員用掃描槍對準(zhǔn)條形碼時,你會看到掃描器發(fā)出一道細長的紅光,就像在條形碼上畫了一條線。這道細細的紅線掃過黑條紋和白條紋,黑色和白色的反光量不同,從而轉(zhuǎn)換為0和1的二進制數(shù)字。
條形碼也叫“一維碼”,因為它的信息只在橫向排列。不管條形碼縱向拉伸多長,它表達的信息都不會改變,因為每根條紋只代表一個數(shù),這樣承載的信息量太少了。為了解決這個問題,世界上第一個二維碼在1994年問世了。二維碼和條形碼的最大區(qū)別在于,它是“二維”的,像圍棋棋盤一樣,每一顆棋子(黑或白)都能表示信息。雖然二維碼面積比一般的條形碼還小,卻能容納更多信息,真可謂“降維打擊”。
二維碼的先進之處遠不止于此。條形碼只能從一個方向掃描,如果把掃描槍旋轉(zhuǎn)90度,它就無法讀取信息了。但二維碼可以從任何方向掃描!無論二維碼貼得多歪,無論你的手機怎么旋轉(zhuǎn),都不會影響掃描成功!
這個神奇的功能是怎么做到的?答案就在于二維碼的三個頂角上。你可能已經(jīng)注意到,任何二維碼,它們的三個頂角都是一樣的,都是一個方框套一個方塊。這三個頂角,就是二維碼的定位區(qū)。
這個看似普通的“方框套方塊”圖案,其實是精心設(shè)計的。二維碼可以印在雜志、廣告、商品包裝上,也可以顯示在電腦或手機屏幕上,但它不會和周邊的圖案混淆,因為這個“方框套方塊”的定位區(qū)有著極為罕見的比例構(gòu)圖。你可以用尺量一下最外層方框的線條粗細、內(nèi)部空白方框的線條粗細、中心正方形方框的邊長,你會發(fā)現(xiàn)它們的比例是精確的1∶1∶3。
為了研發(fā)二維碼,科學(xué)家收集了大量廣告單、雜志、紙板,把圖片和文字都處理成黑白兩色,統(tǒng)計黑白兩色的面積比例。他們最終發(fā)現(xiàn),印刷品中最罕見的寬幅比例,正是1∶1∶3!所以,二維碼幾乎不會和周邊的圖案混淆。當(dāng)手機掃碼時,它先找到3個定位區(qū),然后就可以識別出整個二維碼區(qū)域。
細心的你也許還會注意到,二維碼右下角還有一個小方塊,如下圖橙色框所示:
這個方塊也是用于定位的標(biāo)記,但和三個角的定位區(qū)不一樣,它不是用于定位旋轉(zhuǎn),而是用于確保二維碼在扭曲、拉伸的情況下仍然能夠被識別。沒錯,歪歪扭扭的二維碼仍然能用!哪怕把二維碼印在籃球上,它還是可以被正常識別。
小小一個二維碼,蘊藏著超越時代的精妙設(shè)計和復(fù)雜功能。它能存儲大量信息,識別速度極快,成功率極高,還有超強的糾錯能力。這就是科技時代帶給我們的禮物。