一、QR 码简介

先来看看一维码、二维码,然后深入了解一下QR码,简单点说QR码是二维码的一个种类!!!
在这里插入图片描述

二维码(2-Dimensional Bar Code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。它是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。一维条码的宽度记载着数据,而其长度没有记载数据。二维条码的长度、宽度均记载着数据。二维条码有一维条码没有的“定位点”和“容错机制”。容错机制在即使没有辨识到全部的条码、或是说条码有污损时,也可以正确地还原条码上的信息。QR码呈正方形,常见的是黑白两色。在3个角落,印有较小,像“回”字的正方图案。这3个是帮助解码软件定位的图案,用户不需要对准,无论以任何角度扫描,数据仍然可以正确被读取。
在这里插入图片描述
对于不同版本的二维码,容量也是不同的。理论上内容经过压缩处理后可以存7089个数字,4296 个字母和数字混合字符,2953个8位字节数据,1817个汉字;在上面我们看到,不同的Version的QR Code是不同的矩阵,Version版本越过,也就意味着容量越大。
在这里插入图片描述
关于QR码的细节知识我们作为了解即可,今天主要学习如何使用python中的库生成我们想要的二维码,如果对此比较感兴趣可以点击这个传送门,进行深入学习!向大佬致敬。

二、qrcode库简介

1.简介

qrcode模块是Github上的一个开源项目,提供了生成二维码的接口。qrcode默认使用PIL库用于生成图像。由于生成qrcode图片需要依赖Python的图像库,所以需要先安装Python图像库PIL(Python Imaging Library),在使用PIL库时,由于PIL有些更新,直接使用pip install PIL命令会报出以下错误ModuleNotFoundError: No module named 'PIL',可以改用以下命令安装上PIL库。

pip install pillow

常用的库函数:

  • add_data(str,optimize=20):添加要转换的文字到data参数; 如果使用了optimize优化参数,数据将被拆分为多个块来进行优化,以找到一个长度至少为这个值的足够简洁的方式来生成二维码。设置为"0”以避免优化。
  • make(fit=True):当fit参数为真或者没有给出version参数时,将会调用best_fit方法来找到适合数据的最小尺寸。
  • make_image(ill color=None, back_color=None,image_factory=None):创建二维码的图像并返回,默认为PIL图像。

参数配置

  • version: 一个整数,范围为1到40,表示二维码的大小(最小值是1,是个12×12的矩阵),如果想让程序自动生成,将值设置为 None 并使用 fit=True 参数即可。
  • error_correction: 二维码的纠错范围,可以选择4个常量:
    ··1. ERROR_CORRECT_L 7%以下的错误会被纠正
    ··2. ERROR_CORRECT_M (default) 15%以下的错误会被纠正
    ··3. ERROR_CORRECT_Q 25 %以下的错误会被纠正
    ··4. ERROR_CORRECT_H. 30%以下的错误会被纠正
  • boxsize: 每个点(方块)中的像素个数
  • border: 二维码距图像外围边框距离,默认为4,而且相关规定最小为4

一般情况生成二维码的步骤:

  • 创建QRCode对象
  • add_data()添加数据
  • make_image()创建二维码(返回im类型的图片对象)
  • 自动打开图片,im.show()

下面看一个例子:

import qrcode

data = 'http://www.baidu.com/'
img_file = r'保存路径'

# 实例化QRCode生成qr对象
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_H,
    box_size=10,
    border=4
)
# 传入数据
qr.add_data(data)

qr.make(fit=True)

# 生成二维码
img = qr.make_image()

# 保存二维码
img.save(img_file)
# 展示二维码
img.show()

可以发现,通过调参,可以生成不同外观但存储信息相同的二维码:
在这里插入图片描述
在这里插入图片描述

2.前期准备

ModuleNotFoundError: No module named 'qrcode',如果出现这个错误的话,证明我们没有安装qrcode这个库,可以使用以下命令安装qrcode。然后导入使用!

pip3 install qrcode

安装好之后就可以快乐的生成二维码了!!!

三、改变样式

1.生成中间带图片的二维码

效果如下图,实际上还是将信息藏在二维码中,只是改变了二维码的样式!!!
在这里插入图片描述

用到的代码如下:

import qrcode
from PIL import Image
import matplotlib.pyplot as plt


def getQRcode(data, file_name):
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_H,
        box_size=5,
        border=4,
    )

    # 添加数据
    qr.add_data(data)
    # 填充数据
    qr.make(fit=True)
    # 生成图片
    img = qr.make_image(fill_color="green", back_color="white")

    # 添加logo,打开logo照片
    icon = Image.open("1.jpg")
    # 获取图片的宽高
    img_w, img_h = img.size
    # 参数设置logo的大小
    factor = 6
    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
    # 重新设置logo的尺寸
    icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)
    # 得到画图的x,y坐标,居中显示
    w = int((img_w - icon_w) / 2)
    h = int((img_h - icon_h) / 2)
    # 黏贴logo照
    img.paste(icon, (w, h), mask=None)
    # 终端显示图片
    plt.imshow(img)
    plt.show()
    # 保存img
    img.save(file_name)
    return img


if __name__ == '__main__':
    getQRcode("http://oj.aiecp.cn", 'my1.png')

2.生成炫彩二维码

生成之后大概就是这个样子!当然啦这个样式需要用到另外一个库myqr,直接使用pip install myqr下载即可,如果没有配置镜像源可能下载较慢!
在这里插入图片描述

代码如下:

from MyQR import myqr

myqr.run(
    words='https://blog.csdn.net/apple_51931783?type=blog', # 扫描二维码后,显示的内容,或是跳转的链接
    version=5,# 设置容错率
    level='H',# 控制纠错水平,范围是L、M、Q、H,从左到右依次升高
    picture='1.gif',# 图片所在目录,可以是动图
    colorized=True, # 黑白(False)还是彩色(True)
    contrast=1.0, # 用以调节图片的对比度,1.0 表示原始图片。默认为1.0。
    brightness=1.0, # 用来调节图片的亮度,用法同上。
    save_name='Python.gif' # 控制输出文件名,格式可以是 .jpg, .png ,.bmp ,.gif
)

剩下的样式,大家在遇到之后或者对此很感兴趣可以自行查阅,只需简单的调参就可以获得灰常好看的二维码了。这里就不细说了!


二维码的知识到这也就结束了,本篇博客介绍的较为基础了,炫彩的二维码也并不常用,所以大家好好掌握普通的二维码生成,在熟练之后逐步向复杂二维码迈进吧!!!

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐