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中的程式碼生成並儲存二維碼,解析執行結果如下: