python使用pyzbar批量识别图片中的二维码

背景

今天QQ群里面有人问到谁有二维码提取的工具,样子如下 python使用pyzbar批量识别图片中的二维码

我一看这个工具,感觉功能实现上比较简单,但我后来想了想这个工具功能虽然简单,但使用的人群还是比较多的,于是今天抽出几分钟的时间把这个工具的核心代码撸了撸,虽然没有做GUI,但运行代码基本上功能都实现了

准备要识别的二维码图片

要识别的二维码图片(内容:www.h3blog.com)如下: python使用pyzbar批量识别图片中的二维码

准备python环境

我的python环境是python3.8 创建目录qrcode目录,进入改目录执行如下代码

cd qrcode

python -m venv venv

\venv\Scripts\Activate.ps1 # windows powershell 执行进入python虚拟环境

# 安装 pyzbar 模块
pip install pyzbar
#安装 PIL库
pip install pillow

实现简单的单张二维码图片识别代码

from PIL import Image
import pyzbar.pyzbar as pyzbar

img_path = 'qrcode.png'
img = Image.open(img_path)

#使用pyzbar解析二维码图片内容
barcodes = pyzbar.decode(img)

#打印解析结果,从结果上可以看出,data是识别到的二维码内容,rect是二维码所在的位置
print(barcodes)
# [Decoded(data=b'http://www.h3blog.com', type='QRCODE', rect=Rect(left=7, top=7, width=244, height=244), polygon=[Point(x=7, y=7), Point(x=7, y=251), Point(x=251, y=251), Point(x=251, y=7)])]

for barcode in barcodes:
    barcode_content = barcode.data.decode('utf-8') # 二维码内容
    print(barcode_content)
    barcode_rect = barcode.rect # 二维码在图片中的位置
    qr_size = list(barcode_rect) #二维码大小
    print(qr_size)

批量识别图片二维码

我们把上面的代码重构下,做一个批量识别二维码的小工具,程序读取指定目录下面的图片,将识别结果保存到txt文件中

代码如下保存成 qrcode.py:

from PIL import Image
import pyzbar.pyzbar as pyzbar
import os

def qrcode_parse_content(img_path):
    '''
    单张图片的二维码解析
    '''
    img = Image.open(img_path)

    #使用pyzbar解析二维码图片内容
    barcodes = pyzbar.decode(img)

    #打印解析结果,从结果上可以看出,data是识别到的二维码内容,rect是二维码所在的位置
    # print(barcodes)
    # [Decoded(data=b'http://www.h3blog.com', type='QRCODE', rect=Rect(left=7, top=7, width=244, height=244), polygon=[Point(x=7, y=7), Point(x=7, y=251), Point(x=251, y=251), Point(x=251, y=7)])]

    result = []
    for barcode in barcodes:
        barcode_content = barcode.data.decode('utf-8')
        result.append(barcode_content)

    return result

def load_imgs(folder):
    '''
    加载文件夹下的图片
    '''
    imgs = []
    for img_path in os.listdir(folder):
        ext = os.path.splitext(img_path)
        if len(ext) > 1 and is_img(ext[1]):
            imgs.append(img_path)

    return imgs

def is_img(ext):
    '''
    判断文件后缀是否是图片
    '''
    ext = ext.lower()
    if ext == '.jpg':
        return True
    elif ext == '.png':
        return True
    elif ext == '.jpeg':
        return True
    elif ext == '.bmp':
        return True
    else:
        return False

if __name__ == "__main__":

    imgs = load_imgs('./') # 打开图片文件夹,我这里是当前程序运行目录
    contents = []
    for img in imgs:
        contents.extend(qrcode_parse_content(img))

    file = './result.txt' # 写入文件路径,我这里程序当前运行目录下的result.txt
    with open(file,'w') as f:
        for c in contents:
            f.write(c + '\n')

运行

python qrcode.py

总结

这里面注意是运用pyzbar识别二维码,整个过程比较简单,上述代码供大家参考,当然加上GUI界面操作就有一点点的小逼格了,2333333