如何使用 Python 生成酷炫的二維碼?
那麼讓我們來扒一扒如何使用 Python 生成二維碼圖片。
二維碼
二維碼(2-dimensional bar code),是用某種特定的幾何圖形按一定規律在平面(二維方向上)分布的黑白相間的圖形記錄數據符號信息的。它能將數字、英文字母、漢字、日文字母、特殊符號(如空格,%,/ 等)、二進位等信息記錄到一個正方形的圖片中。
因此,在轉換的過程中,離不開編碼壓縮方式。在許多種類的二維條碼中,常用的碼制有:Data Matrix,Maxi Code,Aztec,QR Code,Vericode,PDF417,Ultracode,Code 49,Code 16K等。
二維碼在現實生活中的應用越來與普遍,歸功於 QR code 碼制的流行。我們常說的二維碼就是它,所以,二維碼又被稱為 QR code。
QR code 是一種矩陣式二維條碼(又稱棋盤式二維條碼)。它是在一個矩形空間通過黑、白像素在矩陣中的不同分布進行編碼。在矩陣相應元素位置上,用點(方點、圓點或其他形狀)的出現表示二進位「1」,點的不出現表示二進位的「0」,點的排列組合確定了矩陣式二維條碼所代表的意義。
二維碼結構
我們的目的是要使用 Python 生成 QR 碼,那我們需要先了解二維碼(QR 碼)的結構。
根據標準(ISO/IEC 18004),我們可以了解到 QR 碼結構如下:
圖片來源於網路
1、功能圖形
功能圖形是不參與編碼數據的區域。它包含空白區、位置探測圖形、位置探測圖形分隔符、定點陣圖形、校正圖形五大模塊。
2、 編碼區域
編碼區域是數據進行編碼存儲的區域,它由格式信息、版本信息、數據和糾錯碼字三部分構成。
格式信息:所有尺寸的二維碼都有該信息。它存放一些格式化數據的信息,例如容錯級別、數據掩碼,和額外的自身 BCH 容錯碼。
版本信息:版本信息是規定二維碼的規格。前面講到 QR 碼一共有 40 種規格的矩陣(一般為黑白色),從21x21(版本1),到177x177(版本40),每一版本符號比前一版本的每邊增加4個模塊。
數據和糾錯碼:主要是存儲實際數據以及用於糾錯碼字。
二維碼的繪製過程
二維碼已經有一套國際標準了,所以繪製二維碼的過程要嚴格按照標準來執行。這個過程比較複雜,下面總結出了大致繪製過程。如果你想深入了解繪製細節,可以閱讀具體標準。
二維碼的繪製大概過程如下:
在二維碼的左上角、左下角、右上角繪製位置探測圖形,位置探測圖形一定是一個 7x7 的矩陣;
繪製校正圖形,校正圖形一定是一個 5x5 的矩陣;
繪製兩條連接三個位置探測圖形的定點陣圖形;
在上述圖片的基礎上,繼續繪製格式信息;
接著繪製版本信息;
填充數據碼和糾錯碼到二維碼圖中;
最後繪製蒙版圖案。因為按照上述方式填充內容,可能會出現大面積空白或黑塊的情況,導致掃描識別十分困難。所以需要對整個圖像與蒙版進行蒙版操作(Masking),蒙版操作即為異或 XOR 操作。在這一步,我們可以將數據排列成各種圖片。
二維碼的生成
我們既然已經了解二維碼原理,那麼可以利用 Python 生成二維碼。網路上高人比比皆是,已經有大神編寫了 Python 生成二維碼的第三方庫,所以我們不需要重複造輪子, 使用現成的庫即可。
我就推薦兩個庫:qrcode 和 python-qrcode。
1、qrcode
qrcode 運行在 Python 3 版本上,它可以玩出很多花樣。例如能生成以下三種二維碼圖片:普通二維碼、帶圖片的藝術二維碼(黑白與彩色)、動態二維碼(黑白與彩色)。它比較適合直接用於生成二維碼圖片的場景。
安裝 qrcode 庫可以使用 pip 方式。但是該庫依賴 pillow、numpy 和 imageio。因此,我們需要先安裝依賴庫,再安裝 qrcode。最後的安裝命令如下:
該庫生成帶圖片的藝術二維碼算是一大亮點,具體用法如下:
上述命令作用是將 Github 主頁寫到彩色二維碼中。
該庫還支持生成 Gif 的彩色二維碼圖片,具體用法如下:
效果圖如下:
最後補上該庫的 Github 地址:https://github.com/sylnsfar/qrcode/。
2、python-qrcode
python-qrcode 相比 qrcode 要稍微遜色一點。不過它也有自己的特色,它支持生成矢量圖,而且比較適合在代碼中生成二維碼的場景。
安裝 python-qrcode 同樣建議使用 pip 方式,安裝命令如下:
在 Python 代碼中,最簡單的用法是這樣。
它也支持自定義二維碼的信息,具體用法如下:
如果你想深入了解該庫,可以到 Github 倉庫閱讀相關的文檔。
Github 地址:https://github.com/lincolnloop/python-qrcode。
作者:極客猴,熱衷於 Python,目前擅長於利用 Python製作網路爬蟲以及 Django 框架。
聲明:本文為作者投稿,版權歸對方所有。


※被罰 50 億美元,Android 究竟招誰惹誰了?
※Facebook的秘密伺服器,竟藏著互聯網的軍事根源?
TAG:CSDN |