新時代,人們有新的追求,天然而然會有新發明的誕生。去年,在「一帶一路」國際合做高峯論壇舉行期間,20國青年投票選出中國的「新四大發明」:高鐵、掃碼支付、共享單車和網購。其中掃碼支付指手機經過掃描二維碼跳轉到支付頁面,再進行付款。這種新的支付方式,造就二維碼滿天飛的現象。那麼讓咱們來扒一扒如何使用 Python 來生成二維碼圖片。python
1 二維碼git
二維碼(2-dimensional bar code),是用某種特定的幾何圖形按必定規律在平面(二維方向上)分佈的黑白相間的圖形記錄數據符號信息的。它能將數字、英文字母、漢字、日文字母、特殊符號(如空格,%,/ 等)、二進制等信息記錄到一個正方形的圖片中。github
所以,在轉換的過程當中,離不開編碼壓縮方式。在許多種類的二維條碼中,經常使用的碼制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等。網絡
二維碼在現實生活中的應用越來與廣泛,歸於功於 QR code 碼制的流行。咱們常說的二維碼就是它。因此,二維碼又被稱爲 QR code。編碼
QR code 是一種矩陣式二維條碼(又稱棋盤式二維條碼)。它是在一個矩形空間經過黑、白像素在矩陣中的不一樣分佈進行編碼。在矩陣相應元素位置上,用點(方點、圓點或其餘形狀)的出現表示二進制「1」,點的不出現表示二進制的「0」,點的排列組合肯定了矩陣式二維條碼所表明的意義。spa
2 二維碼結構code
咱們的目的是要使用 Python 生成 QR 碼,那咱們須要先了解二維碼(QR 碼)的結構。根據標準(ISO/IEC 18004),咱們能夠了解到 QR 碼結構以下:圖片
1) 功能圖形ip
功能圖形是不參與編碼數據的區域。它包含空白區、位置探測圖形、位置探測圖形分隔符、定位圖形、校訂圖形五大模塊。it
● 空白區
空白區顧名思義就是要留空白。所以,這裏不能有任何圖樣或標記。這樣才能保證 QR 能被識別。
● 位置探測圖形
這個有點相似中文的「回」字。在 QR 碼中有個這樣的標識,它分別的左上、右上和左下角。做用是協助掃描軟件定位 QR 碼並轉換座標系。咱們在掃描二維碼的時候,不論是豎着掃、橫着掃、斜着掃都能識別出內容,主要是它的功勞。
● 位置探測圖形分隔符
主要做用是區分功能圖形和編碼區域。
● 定位圖形
它由黑白間隔的各自各自組成的線條。主要用於指示標識密度和肯定座標系。緣由是 QR 碼一種有 40 個版本,也就是說有 40 種尺寸。每種二維碼的尺寸越大,掃描的距離就越遠。
● 校訂圖形
只有 Version 2 及以上的QR碼有校訂標識。校訂標識用於進一步校訂座標系。
2) 編碼區域
編碼區域是數據進行編碼存儲的區域。它由格式信息、版本信息、數據和糾錯碼字三部分構成。
● 格式信息
全部尺寸的二維碼都有該信息。它存放一些格式化數據的信息,例如容錯級別、數據掩碼,和額外的自身 BCH 容錯碼。
● 版本信息
版本信息是規定二維碼的規格。前面講到 QR 碼一共有 40 種規格的矩陣(通常爲黑白色),從21x21(版本1),到177x177(版本40),每一版本符號比前一版本 每邊增長4個模塊。
● 數據和糾錯碼
主要是存儲實際數據以及用於糾錯碼字。
3 二維碼的繪製過程
二維碼已是有一套國際標準,繪製二維碼過程的嚴格按照標準來執行。這個過程是比較複雜,我本身也是看了大概,而後總結出大體繪製過程。若是你想深刻了解繪製細節,能夠閱讀標準。
二維碼的繪製大概過程以下:
1)在二維碼的左上角、左下角、右上角繪製位置探測圖形。位置探測圖形必定是一個 7x7 的矩陣。
2)繪製校訂圖形。校訂圖形必定是一個 5x5 的矩陣。
3)繪製兩條鏈接三個位置探測圖形的定位圖形。
4)在上述圖片的基礎上,繼續繪製格式信息。
5)接着繪製版本信息。
6)填充數據碼和糾錯碼到二維碼圖中。
7)最後是繪製蒙版圖案。由於按照上述方式填充內容,可能會出現大面積的空白或黑塊的狀況,致使掃描識別會十分困難。因此須要對整個圖像與蒙版進行蒙版操做(Masking),蒙版操做即爲異或 XOR 操做。在這一步,咱們能夠將數據排列成各類圖片。
4 二維碼的生成
咱們既然已經瞭解二維碼原理,那麼能夠利用 Python 生成二維碼。然而網絡上高人比比皆是。已經有大神編寫了 Python 生成二維碼的第三方庫,因此咱們不須要重複造輪子, 使用現成的庫便可。
我就推薦兩個庫:qrcode和python-qrcode。
● qrcode
qrcode運行在 Python 3 版本上,它能夠玩出不少花樣。例如能生成如下三種二維碼圖片:普通二維碼、帶圖片的藝術二維碼(黑白與彩色)、動態二維碼(黑白與彩色)。它比較適合直接用於生成二維碼圖片的場景。
安裝 qrcode 庫可使用 pip 方式。可是該庫依賴pillow、numpy和imageio。所以,咱們須要先安裝依賴庫,再安裝 qrcode。最後的安裝命令以下:
該庫生成帶圖片的藝術二維碼算是一大亮點,具體用法以下:
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要稍微遜色一點。不過它也有本身的特點。它支持生成矢量圖,並且比較適合在代碼中生成二維碼的場景。