1. 程式人生 > 實用技巧 >Python3+qrcode+zxing生成和識別二維碼教程

Python3+qrcode+zxing生成和識別二維碼教程

搬運出處:https://www.cnblogs.com/lsdb/p/9728621.html

一、安裝依賴庫

pip install qrcode pillow image zxing

pillow是python3中PIL的代替庫,image是生成圖版需要用到的庫

安裝image時報錯“Could not install packages due to an EnvironmentError: [Errno 22] invalid mode ('wb') or filename”,沒管,直接在pycharm的setting中安裝就沒報錯了。

二、使用qrcode生成二維碼

2.1 qrcode簡單用法

以下是生成指向百度的二維碼為例,使用者掃描後會訪問百度首頁。程式碼如下。

另外注意我們日常使用是掃一個二維碼就跳轉到某個頁面。但本質而言,掃二維碼就是得到內容,而不會跳轉什麼頁面。

比如微信等掃以下二維碼就是得到“https://www.baidu.com”,至於自動跳到百度首頁是因為微信添加了如果掃描二維碼結果是url就自動跳轉的程式碼造成的。

也就是說二維碼的內容完全可以不是url,而是“abcd”等仍意字串,用微信掃時顯示“abcd”而不是跳轉什麼頁面而已。

不過由於二維碼(指qr code)的容量是有限的,只有幾百到幾千個位元組,所以一般不會直接用來存圖片等內容。

import qrcode

# 二維碼內容
data = "https://www.baidu.com"
# 生成二維碼
img = qrcode.make(data=data)
# 直接顯示二維碼
img.show()
# 儲存二維碼為檔案
# img.save("baidu.jpg")

生成二維碼如下:

2.2 qrcode高階用法

所謂高階用法,就是設定二維碼大小、顏色等引數的寫法。示例程式碼如下,其中例項化參意義如下:

version引數----二維碼的格子矩陣大小,可以是1到40,1最小為21*21,40是177*177

error_correction引數----二維碼錯誤容許率,預設ERROR_CORRECT_M,容許小於15%的錯誤率

box_size引數----二維碼每個小格子包含的畫素數量

border引數----二維碼到圖片邊框的小格子數,預設值為4

(不太確定是不是都對,可直接檢視官方說明:https://github.com/lincolnloop/python-qrcode#advanced-usage

import qrcode
# 例項化二維碼生成類
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=4,
)
# 設定二維碼資料
data = "https://www.baidu.com"
qr.add_data(data=data)

# 啟用二維碼顏色設定
qr.make(fit=True)
img = qr.make_image(fill_color="green", back_color="white")

# 顯示二維碼
img.show()

生成二維碼如下:

三、使用zxing識別二維碼

3.1 zxing報錯處理

google流行的是使用qrtools來讀二維碼,但是qrtools依賴zbar不相容python3,其替代品zbarlight在windows安裝又很麻煩,直接放棄了。

又回頭折騰百度上流行的zxing,zxing一直報”python zxing OSError: [WinError 6] 控制代碼無效“,直接搜“if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:”。看到這篇文章說windows上報這個錯可以直接“註釋掉subprocess.py中的 _cleanup()方法”。雖然說的不是zxing,但庫是一樣的,姑且一試還真可以。

如下圖所示,將_cleanup()直接註釋掉:

3.2 zxing識別二維碼程式碼

import zxing

reader = zxing.BarCodeReader()
barcode = reader.decode("baidu.jpg")
print(barcode.parsed)

3.3 執行示例

使用2.1中的程式碼生成並儲存二維碼,解析執行結果如下: