巧用Python的Qrcode库生成二维码大全

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/suoyue_py/article/details/98486348

二维码介绍

QR 码是二维条码的一种,QR来自英文 “Quick Response” 的缩写,即快速反应的意思,源自发明者希望 QR 码可让其内容快速被解码。
QR 码 比普通条码可存储更丰富的信息,包括对文字、URL 地址和其他类型的数据加密,亦无需像普通条码般在扫描时需直线对准扫描器。
QR码呈正方形,只有黑白两色。在3个角落中印有较小的“回”字正方图案,这3个是帮助解码软件定位的图案,用户可不需要对准扫描,任意角度数据都能被正确读取。
在这里插入图片描述

QR二维码结构

  • 版本信息
    version1(21 * 21) , version2 , … , version40(177 * 177) , 一共有40个版本
    版本代表每行有多少码元模块,每一个版本比前一个版本增加4个码元模块,计算公式为 (n-1)*4+21,每个码元模块存储一个二进制0或者1。黑色模块代表二进制 “1”白色模块代表二进制 “0” ,例如 version1 表示每一行有21个码元模块。
  • 格式信息
    存储容错级别L(7%),M(15%),Q(25%),R(35%)
    L水平 7% 的字码可被修正
    M水平15% 的字码可被修正
    Q水平 25% 的字码可被修正
    H水平 30% 的字码可被修正
    容错: 允许存储的二维信息出现重复部分,级别越高,重复信息所占的比例越高。
    目的: 即使二维码部分被遮住(例如图标等等),一样可以获取全部二维码内容
  • 数据和纠错码字
    实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误,就是说当二维码部分被遮住时,可以通过纠错码字来找回)
  • 位置探测图形
    用于对二维码的定位。位置探测图形用于标记矩形大小,3个图形确定一个矩形

qrcode二维码生成

学Python用qrcode代码自动生成二维码,再也不用找草料:https://cli.im/ 来生成二维码装逼了
在这里插入图片描述
准备工作:
需要使用qrcode库和PIL库,对此没安装的需要安装一下
安装qrcode:命令行窗口输入 pip install qrcode
在这里插入图片描述
安装PIL库:pip install pillow
在这里插入图片描述
到此可以开始敲代码了
在这里插入图片描述
二维码生成只需要三行代码:

import qrcode		#导入qrcode库
img = qrcode.make("https://blog.csdn.net/suoyue_py")		#生成二维码的网址(文本也行)
img.save("suoyue.png")		#生成二维码后保存的图片名

此处有坑: 代码保存,命名文件时不能为 “qrcode.py”,因为 import 时相当于把自己 import 了,故必须修改为非 “qrcode.py”(改为大写的Q都行~~)。
否则运行时会报错:
AttributeError: ‘module’ object has no attribute ‘make’
在这里插入图片描述
注意: 保存二维码(图片)需要调用PIL库,故需要安装pillow库,否则也是会报错的
解决小bug后运行正常可在同一文件夹下找到生成的二维码

进阶版:生成带logo的二维码

import qrcode
from PIL import Image
import os,sys

#参数 string:二维码字符串;path:生成的二维码保存路径;logo:logo文件路径
def gen_qrcode(string,path,logo=""):
    qr = qrcode.QRCode(
        version=2,      #控制二维码的大小:(25*25)
        error_correction=qrcode.constants.ERROR_CORRECT_H,  #ERROR_CORRECT_H:30%的字码可被容错
        box_size=8,     #控制二维码中每个小格子包含的像素数
        border=1        #控制边框(二维码与图片边界的距离)包含的格子数(默认为4) 
    )
    qr.add_data(string)
    qr.make(fit=True)
    img = qr.make_image()
    img = img.convert("RGBA")
    if logo and os.path.exists(logo):
        try:
            icon = Image.open(logo)
            img_w, img_h = img.size
        except Exception as e:
            print(e)
            sys.exit(1)
        factor = 4
        size_w = int(img_w / factor)
        size_h = int(img_h / factor)

        icon_w, icon_h = icon.size
        if icon_w > size_w:
            icon_w = size_w
        if icon_h > size_h:
            icon_h = size_h
        icon = icon.resize((icon_w,icon_h),Image.ANTIALIAS)

        w = int((img_w - icon_w) / 2)
        h = int((img_h - icon_h) / 2)
        icon = icon.convert("RGBA")
        img.paste(icon,(w,h),icon)
    img.save(path)
    #调用系统命令打开图片
    # xdg-open :在用户的首选应用程序中打开文件或url
    os.system('xdg-open %s' % path)

if __name__ == "__main__":
    info = "https://blog.csdn.net/suoyue_py"        #生成二维码的网址
    pic_path = "qrsuoyue.png"           #生成二维码保存的图片名
    logo_path = "logo.png"              #生成二维码所用的图标
    gen_qrcode(info,pic_path,logo_path)     #调用函数

error_correction: 控制二维码的错误纠正功能。
可取值下列 4个常量:
1.ERROR_CORRECT_L: 7%的字码可被容错
2.ERROR_CORRECT_M(默认): 15%的字码可被容错
3.ERROR_CORRECT_Q: 25%的字码可被容错
4.ERROR_CORRECT_H: 30%的字码可被容错
二维码的容错系数(上面所指的 error_correction)越高,生成的二维码则可允许的残缺率越大,且二维码的数据主要保存在图片的四个角上,所以在二维码中间放一个小图标,对二维码的识别也是不受多大影响的

猜你喜欢

转载自blog.csdn.net/suoyue_py/article/details/98486348