python用于識(shí)別二維碼的主要有三個(gè)包,zbar 、zbarlight、zxing。
從網(wǎng)上down了一個(gè)關(guān)于zxing的代碼下來試試,程序報(bào)錯(cuò)是編碼問題。重新學(xué)習(xí)了一下好像對(duì)伸手黨不是很友好。于是重新開始學(xué)習(xí)其他兩種包。
zbar:
zbar和zbarlight內(nèi)核一致,都是基于zbar的dll編譯加載的。
由于zbar只有32位的版本,聽聞64位python最后會(huì)出現(xiàn)“ImportError: DLL load failed: %1 不是有效的 Win32 應(yīng)用程序。"錯(cuò)誤,暫時(shí)無解。
zbarlight:
zbar和zbarlight內(nèi)核一致,都是基于zbar的dll編譯加載的。安裝過程中出現(xiàn)
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/
但是檢查過我的系統(tǒng)環(huán)境,根據(jù)網(wǎng)上教程重新裝過一次,也沒用,還是同樣的問題,暫時(shí)沒有想到解決方法。
zxing:
zxing是基于java的zxing核心的python分支,其原理是調(diào)用javaw 加載zxing的core.jar包,再獲取輸出結(jié)果。按照網(wǎng)上所說的,識(shí)別能力來說,zxing>zbarlight(zbar)。所以我又回來了!
下載:
pip3 install zxing
或者直接在pycharm中導(dǎo)入,ctrl+回車
實(shí)現(xiàn)代碼:
import os
import logging
from PIL import Image
import zxing #導(dǎo)入解析包
import random
logger=logging.getLogger(__name__)
if not logger.handlers :logging.basicConfig(level=logging.INFO)
DEBUG= (logging.getLevelName(logger.getEffectiveLevel())=='DEBUG')
def ocr_qrcode_zxing(filename):
#在當(dāng)前目錄生成臨時(shí)文件,規(guī)避java的路徑問題
img= Image.open(filename)
ran= int(random.random()*100000)
img.save('%s%s.jpg' %(os.path.basename(filename).split('.')[0],ran))
zx = zxing.BarCodeReader()
data = ''
zxdata = zx.decode('%s%s.jpg' %(os.path.basename(filename).split('.')[0], ran))
print(zxdata)
#刪除臨時(shí)文件
os.remove('%s%s.jpg' %(os.path.basename(filename).split('.')[0],ran))
if zxdata:
logger.debug(u'zxing識(shí)別二維碼:%s,內(nèi)容: %s' %(filename ,zxdata))
data = zxdata
else:
logger.error(u'識(shí)別zxing二維碼出錯(cuò):%s' %(filename))
img.save('%s-zxing.jpg' %filename)
return data
if __name__ == '__main__':
filename = r'G:\wx\ww\c5a9367c3df1d2c8d64f1dc28bdb279.png'
#zxing二維碼識(shí)別
ltext = ocr_qrcode_zxing(filename)
logger.info( u'[%s]Zxing二維碼識(shí)別:[%s]!!!' %(filename,ltext))
print(ltext)
注意,以上代碼識(shí)別的二維碼信息中不能為中文。不然會(huì)報(bào)錯(cuò),解決方法需要另外學(xué)習(xí),稍等我一會(huì)。
打印出來的信息就是原始的二維碼信息了。以上代碼也是從同行處借鑒而來,學(xué)習(xí)參考。。
其他兩種方法暫時(shí)么有嘗試過,電腦位數(shù)實(shí)在令望而卻步。
中文報(bào)錯(cuò)問題解決:
找到python3安裝路徑下的zxing包,進(jìn)去在init修改源碼,將barcode函數(shù)中的decode(),加上“gkb”,運(yùn)行即可。
從另外大牛那里學(xué)習(xí)到的是將函數(shù)直接return utf-8,嘗試過,沒有用,不知道為什么。