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