新時代锅知,人們有新的追求,自然而然會有新發(fā)明的誕生脓钾。去年售睹,在“一帶一路”國際合作高峰論壇舉行期間氢哮,20國青年投票選出中國的“新四大發(fā)明”:高鐵导匣、掃碼支付沫勿、共享單車和網(wǎng)購短荐。其中掃碼支付指手機通過掃描二維碼跳轉(zhuǎn)到支付頁面,再進行付款卸奉。這種新的支付方式慰毅,造就二維碼滿天飛的現(xiàn)象德撬。那么讓我們來扒一扒如何使用 Python 來生成二維碼圖片谨胞。
1 二維碼
二維碼(2-dimensional bar code)固歪,是用某種特定的幾何圖形按一定規(guī)律在平面(二維方向上)分布的黑白相間的圖形記錄數(shù)據(jù)符號信息的。它能將數(shù)字畜眨、英文字母昼牛、漢字、日文字母康聂、特殊符號(如空格,%胞四,/ 等)恬汁、二進制等信息記錄到一個正方形的圖片中。
因此辜伟,在轉(zhuǎn)換的過程中氓侧,離不開編碼壓縮方式脊另。在許多種類的二維條碼中,常用的碼制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等约巷。
二維碼在現(xiàn)實生活中的應(yīng)用越來與普遍偎痛,歸于功于 QR code 碼制的流行。我們常說的二維碼就是它独郎。所以踩麦,二維碼又被稱為 QR code。
QR code 是一種矩陣式二維條碼(又稱棋盤式二維條碼)氓癌。它是在一個矩形空間通過黑谓谦、白像素在矩陣中的不同分布進行編碼。在矩陣相應(yīng)元素位置上贪婉,用點(方點反粥、圓點或其他形狀)的出現(xiàn)表示二進制“1”,點的不出現(xiàn)表示二進制的“0”疲迂,點的排列組合確定了矩陣式二維條碼所代表的意義才顿。
2 二維碼結(jié)構(gòu)
我們的目的是要使用 Python 生成 QR 碼,那我們需要先了解二維碼(QR 碼)的結(jié)構(gòu)尤蒿。根據(jù)標(biāo)準(zhǔn)(ISO/IEC 18004)娜膘,我們可以了解到 QR 碼結(jié)構(gòu)如下:
1) 功能圖形
功能圖形是不參與編碼數(shù)據(jù)的區(qū)域。它包含空白區(qū)优质、位置探測圖形竣贪、位置探測圖形分隔符、定位圖形巩螃、校正圖形五大模塊演怎。
●?空白區(qū)
空白區(qū)顧名思義就是要留空白。因此避乏,這里不能有任何圖樣或標(biāo)記爷耀。這樣才能保證 QR 能被識別。
●?位置探測圖形
這個有點類似中文的“回”字拍皮。在 QR 碼中有個這樣的標(biāo)識歹叮,它分別的左上、右上和左下角铆帽。作用是協(xié)助掃描軟件定位 QR 碼并轉(zhuǎn)換坐標(biāo)系咆耿。我們在掃描二維碼的時候,不管是豎著掃爹橱、橫著掃萨螺、斜著掃都能識別出內(nèi)容,主要是它的功勞。
●?位置探測圖形分隔符
主要作用是區(qū)分功能圖形和編碼區(qū)域慰技。
●?定位圖形
它由黑白間隔的各自各自組成的線條椭盏。主要用于指示標(biāo)識密度和確定坐標(biāo)系。原因是 QR 碼一種有 40 個版本吻商,也就是說有 40 種尺寸掏颊。每種二維碼的尺寸越大,掃描的距離就越遠艾帐。
●?校正圖形
只有 Version 2 及以上的QR碼有校正標(biāo)識乌叶。校正標(biāo)識用于進一步校正坐標(biāo)系。
2) 編碼區(qū)域
編碼區(qū)域是數(shù)據(jù)進行編碼存儲的區(qū)域掩蛤。它由格式信息枉昏、版本信息、數(shù)據(jù)和糾錯碼字三部分構(gòu)成揍鸟。
●?格式信息
所有尺寸的二維碼都有該信息兄裂。它存放一些格式化數(shù)據(jù)的信息,例如容錯級別阳藻、數(shù)據(jù)掩碼晰奖,和額外的自身 BCH 容錯碼。
●?版本信息
版本信息是規(guī)定二維碼的規(guī)格腥泥。前面講到 QR 碼一共有 40 種規(guī)格的矩陣(一般為黑白色)匾南,從21x21(版本1),到177x177(版本40)蛔外,每一版本符號比前一版本 每邊增加4個模塊蛆楞。
●?數(shù)據(jù)和糾錯碼
主要是存儲實際數(shù)據(jù)以及用于糾錯碼字。
3 二維碼的繪制過程
二維碼已經(jīng)是有一套國際標(biāo)準(zhǔn)夹厌,繪制二維碼過程的嚴(yán)格按照標(biāo)準(zhǔn)來執(zhí)行豹爹。這個過程是比較復(fù)雜,我自己也是看了大概矛纹,然后總結(jié)出大致繪制過程臂聋。如果你想深入了解繪制細(xì)節(jié),可以閱讀標(biāo)準(zhǔn)或南。
二維碼的繪制大概過程如下:
1)在二維碼的左上角孩等、左下角、右上角繪制位置探測圖形采够。位置探測圖形一定是一個 7x7 的矩陣肄方。
2)繪制校正圖形。校正圖形一定是一個 5x5 的矩陣吁恍。
3)繪制兩條連接三個位置探測圖形的定位圖形扒秸。
4)在上述圖片的基礎(chǔ)上播演,繼續(xù)繪制格式信息冀瓦。
5)接著繪制版本信息伴奥。
6)填充數(shù)據(jù)碼和糾錯碼到二維碼圖中。
7)最后是繪制蒙版圖案翼闽。因為按照上述方式填充內(nèi)容拾徙,可能會出現(xiàn)大面積的空白或黑塊的情況,導(dǎo)致掃描識別會十分困難感局。所以需要對整個圖像與蒙版進行蒙版操作(Masking)尼啡,蒙版操作即為異或 XOR 操作。在這一步询微,我們可以將數(shù)據(jù)排列成各種圖片崖瞭。
4 二維碼的生成
我們既然已經(jīng)了解二維碼原理,那么可以利用 Python 生成二維碼撑毛。然而網(wǎng)絡(luò)上高人比比皆是书聚。已經(jīng)有大神編寫了 Python 生成二維碼的第三方庫,所以我們不需要重復(fù)造輪子, 使用現(xiàn)成的庫即可藻雌。
我就推薦兩個庫:qrcode和python-qrcode雌续。
●?qrcode
qrcode運行在 Python 3 版本上,它可以玩出很多花樣胯杭。例如能生成以下三種二維碼圖片:普通二維碼驯杜、帶圖片的藝術(shù)二維碼(黑白與彩色)、動態(tài)二維碼(黑白與彩色)做个。它比較適合直接用于生成二維碼圖片的場景鸽心。
安裝 qrcode 庫可以使用 pip 方式。但是該庫依賴pillow居暖、numpy和imageio顽频。因此,我們需要先安裝依賴庫膝但,再安裝 qrcode冲九。最后的安裝命令如下:
該庫生成帶圖片的藝術(shù)二維碼算是一大亮點,具體用法如下:
myqr https://github.com -p github.jpg -c
上述命令作用是將 github 主頁寫到彩色二維碼中跟束。
?
該庫還支持生成 gif 的彩色二維碼圖片莺奸,具體用法如下:
myqr https://github.com -p github.gif -c -con1.5-bri1.6
效果圖如下:
?
●?python-qrcode
python-qrcode相比qrcode要稍微遜色一點。不過它也有自己的特色冀宴。它支持生成矢量圖灭贷,而且比較適合在代碼中生成二維碼的場景。
?