vlambda博客
学习文章列表

二维码生成及解码--python实现

     Boblee人工智能硕士毕业,擅长及爱好python,基于python研究人工智能、群体智能、区块链等技术,并使用python开发前后端、爬虫等。

1.背景    

     二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的、黑白相间的、记录数据符号信息的图形;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。

2.python生成二维码

    常用的python二维码生成库为qrcode,该库可以生成不同大小、不同规格、带艺术风格的二维码。

pip install qrcode

常用生成方法:

import qrcodeimg = qrcode.make('helloworld')qr = qrcode.QRCode( version=5, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=8, border=4)img.save('qr.jpg')

二维码生成及解码--python实现

中间带logo二维码:

import qrcodefrom PIL import Imagedef gen_qrcode(text,logo_path): # 创建qrcode对象 qr = qrcode.QRCode( version=2, error_correction=qrcode.constants.ERROR_CORRECT_Q, box_size=10, border=2, ) qr.add_data(text) # 创建二维码图片 img = qr.make_image()
# 图片转换为RGBA格式 img = img.convert('RGBA')
# 返回二维码图片的大小 img_w, img_h = img.size
# 打开logo logo = Image.open(logo_path)
# logo大小为二维码的四分之一 logo_w = img_w // 4 logo_h = img_w // 4
# 修改logo图片大小 logo = logo.resize((logo_w, logo_h), Image.ANTIALIAS)
# 把logo放置在二维码中间 w = (img_w - logo_w) // 2 h = (img_h - logo_h) // 2
img.paste(logo, (w, h))
img.save('qr.png')gen_qrcode('helloworld','timg.jpg')

二维码生成及解码--python实现

酷炫二维码:

pip install myqr

代码:

from MyQR import myqrmyqr.run( words='helloworld', # words中填写链接或者文本内容 version=1, # 控制二维码大小 1~40,建议不要超过5,否则生成时间太长 level='H', # 控制纠错水平,范围是L、M、Q、H,从左到右依次升高 picture='timg.jpg', # 背景图片,格式可以是.jpg, .png, .bmp, .gif colorized=True, # 可以使产生的图片由黑白(False)变为彩色(True)的 contrast=1.0, # 用以调节图片的对比度,1.0 表示原始图片,更小的值表示更低对比度,更大反之。默认为1.0。 brightness=1.0, # 用来调节图片的亮度save_name='qr.png', # 控制输出文件名,格式可以是 .jpg, .png ,.bmp ,.gif)

3.python解二维码

python 常用的库有zxing,pyzbar,这两安装都比较麻烦。

安装教程见:

zxing:https://github.com/oostendo/python-zxingpyzbar:https://github.com/NaturalHistoryMuseum/pyzbar

本文选取pyzbar进行解码:

import pyzbar.pyzbar as pyzbarbarcodes = pyzbar.decode(Image.open('qr.png'))for barcode in barcodes: barcodeData = barcode.data.decode("utf-8") print(barcodeData)