管小衛(wèi)
(江蘇財(cái)經(jīng)職業(yè)技術(shù)學(xué)院,江蘇 淮安223003)
二維碼(2-dimensional bar code)又稱二維條碼,是用某種特定的幾何圖形按一定規(guī)律在平面(二維方向上)分布的黑白相間的圖形記錄數(shù)據(jù)符號(hào)信息的。在代碼編制上巧妙地利用構(gòu)成計(jì)算機(jī)內(nèi)部邏輯基礎(chǔ)的“0”、“1”比特流的概念,使用若干個(gè)與二進(jìn)制相對(duì)應(yīng)的幾何形體來表示文字?jǐn)?shù)值信息,通過圖象輸入設(shè)備或光電掃描設(shè)備自動(dòng)識(shí)讀以實(shí)現(xiàn)信息自動(dòng)處理。我們常說的二維碼為QR Code,QR 全稱Quick Response,是一個(gè)近幾年來移動(dòng)設(shè)備上超流行的一種編碼方式,它比傳統(tǒng)的Bar Code 條形碼能存更多的信息,也能表示更多的數(shù)據(jù)類型。QR code 是一種矩陣式二維條碼(又稱棋盤式二維條碼)。它是在一個(gè)矩形空間通過黑、白像素在矩陣中的不同分布進(jìn)行編碼。在矩陣相應(yīng)元素位置上,用點(diǎn)(方點(diǎn)、圓點(diǎn)或其他形狀)的出現(xiàn)表示二進(jìn)制“1”,點(diǎn)的不出現(xiàn)表示二進(jìn)制的“0”,點(diǎn)的排列組合確定了矩陣式二維條碼所代表的意義。
我們的目的是要使用Python 生成QR 碼,那我們需要先了解二維碼(QR 碼)的結(jié)構(gòu)。根據(jù)標(biāo)準(zhǔn)(ISO/IEC 18004),我們可以了解到QR 碼結(jié)構(gòu)如圖1 所示。
圖1 QR 碼結(jié)構(gòu)圖
功能圖形是不參與編碼數(shù)據(jù)的區(qū)域。它包含空白區(qū)、位置探測圖形、位置探測圖形分隔符、定位圖形、校正圖形五大模塊。
空白區(qū):空白區(qū)顧名思義就是要留空白。因此,這里不能有任何圖樣或標(biāo)記,這樣才能保證QR 能被識(shí)別。
位置探測圖形:這個(gè)有點(diǎn)類似中文的“回”字。在QR 碼中有個(gè)這樣的標(biāo)識(shí),它分別位于左上、右上和左下角,作用是協(xié)助掃描軟件定位QR 碼并轉(zhuǎn)換坐標(biāo)系。我們?cè)趻呙瓒S碼的時(shí)候,不管是豎著掃、橫著掃、斜著掃都能識(shí)別出內(nèi)容,主要是它的功勞。
位置探測圖形分隔符:主要作用是區(qū)分功能圖形和編碼區(qū)域。
定位圖形:它由黑白間隔的格子組成的線條,主要用于指示標(biāo)識(shí)密度和確定坐標(biāo)系。原因是QR 碼一共有40 個(gè)版本,也就是說有40 種尺寸。每種二維碼的尺寸越大,掃描的距離就越遠(yuǎn)。
校正圖形:只有Version 2 及以上的QR 碼有校正標(biāo)識(shí),校正標(biāo)識(shí)用于進(jìn)一步校正坐標(biāo)系。
編碼區(qū)域是數(shù)據(jù)進(jìn)行編碼存儲(chǔ)的區(qū)域,它由格式信息、版本信息、數(shù)據(jù)和糾錯(cuò)碼字三部分構(gòu)成。
格式信息:所有尺寸的二維碼都有該信息。它存放一些格式化數(shù)據(jù)的信息,例如容錯(cuò)級(jí)別、數(shù)據(jù)掩碼,和額外的自身 BCH容錯(cuò)碼。
版本信息:版本信息是規(guī)定二維碼的規(guī)格。前面講到QR 碼一共有40 種規(guī)格的矩陣(一般為黑白色),從21x21(版本1),到177x177(版本40),每一版本符號(hào)比前一版本的每邊增加4個(gè)模塊。
數(shù)據(jù)和糾錯(cuò)碼:主要是存儲(chǔ)實(shí)際數(shù)據(jù)以及用于糾錯(cuò)碼字。
首先需要使用pip 命令安裝pillow 、numpy 和matplotlib庫,然后再安裝二維碼庫qrcode ,該庫是用于生成二維碼圖像的Python 第三方庫。qrcode 運(yùn)行在Python 3 版本上,利用該庫能生成多種二維碼圖片:如普通二維碼、高級(jí)二維碼以及帶logo的二維碼等。
例如,生成指向百度的二維碼,用戶掃描后會(huì)訪問百度首頁。代碼如下:
生成二維碼如圖2 所示,通過手機(jī)掃一掃二維碼就跳轉(zhuǎn)到百度首頁。
圖2 普通二維碼
設(shè)置二維碼顏色、大小等參數(shù),實(shí)例化參數(shù)含義如下:
代碼如下:
生成二維碼如圖3 所示。
圖3 高級(jí)二維碼
生成帶logo 的二維碼的過程基本與普通二維碼生成過程相似,其主要的功能就是對(duì)logo 圖片進(jìn)行處理,調(diào)整logo 的尺寸使其符合所需的大小,然后通過paste 方法將其粘貼到二維碼的中心位置。示例代碼如下:
生成二維碼如圖4 所示。
圖4 帶log 的二維碼
Table 1
在python 下二維碼識(shí)別,目前主要有三個(gè)模塊:zbar 、zbarlight、zxing。zxing 比zbarlight(zbar)的識(shí)別能力稍強(qiáng)。使用pip命令安裝zxing 庫。代碼如下:
通過使用微信掃一掃功能,可以快速識(shí)別出二維碼中的內(nèi)容。
本文主要探討了基于Python 的二維碼生成與識(shí)別技術(shù),通過qrcode 庫和zxing 庫來生成和識(shí)別二維碼可知:(1)二維碼本質(zhì)是圖形,可以使用數(shù)字圖像技術(shù)來處理。(2)使用qrcode 庫可以生成不同類型二維碼,它們的處理方式也相似,還可以在此基礎(chǔ)上進(jìn)一步擴(kuò)展,生成更加炫酷的動(dòng)態(tài)二維碼圖案。(3)二維碼具有一定的存儲(chǔ)能力,在讀取信息過程中,可以執(zhí)行一定的解釋性代碼實(shí)現(xiàn)跳轉(zhuǎn),因此存在一定的風(fēng)險(xiǎn)。(4)使用zxing 庫比zbarlight 庫、zbar 庫識(shí)別效果好。