使用 Python 生成二维码

Posted 软件开发技术爱好者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 Python 生成二维码相关的知识,希望对你有一定的参考价值。

使用 Python 生成二维码

现在二维码应用随处可见,生活中二维码可以说是无处不在了:加好友,付钱,扫个码。python生成二维码非常方便。本文就来讲解如何用python开发生成二维码。

二维码基础知识

二维码是用某种特定的几何图形按一定规律在平面(也即二维方向上)分布的黑白相间的图形记录数据符号信息的,它利用了计算机内部逻辑“0”“1”的概念,用几个与二进制相对应的几何图形来表示文字信息,每种码都有特定的字符集。根据标准(ISO/IEC 18004),我们可以了解到 QR 码结构如下:

 各部分解析:

位置探测图形:由三个黑白相间的大正方形嵌套组成,分别位于二维码左上角、右上角、左下角,目的是为了确定二维码的大小和位置。

定位图形 :由两条黑白相间的直线组成,便于确定二维码的角度,纠正扭曲。

校正图形 :仅在版本2以上存在,由三个黑白相间的小正方形嵌套组成,便于确定中心,纠正扭曲。

数据和纠错码:记录数据信息和相应的纠错码,纠错码的存在使当二维码的数据出现允许范围内的错误时,也可以正确解码。

版本信息 :仅在版本7以上存在,记录具体的版本信息。

格式信息 :记录使用的掩码和纠错等级。

格式信息、版本信息、数据和纠错码字三部分构成编码区域

二维码已经有一套国际标准了,所以绘制二维码的过程要严格按照标准来执行。这个过程比较复杂,下面总结出了大致绘制过程。

二维码的绘制大概过程如下:

在二维码的左上角、左下角、右上角绘制位置探测图形,位置探测图形一定是一个 7x7 的矩阵;

绘制校正图形,校正图形一定是一个 5x5 的矩阵;

绘制两条连接三个位置探测图形的定位图形;

在上述图片的基础上,继续绘制格式信息;

接着绘制版本信息;

填充数据码和纠错码到二维码图中;

最后绘制蒙版图案。因为按照上述方式填充内容,可能会出现大面积空白或黑块的情况,导致扫描识别十分困难。所以需要对整个图像与蒙版进行蒙版操作(Masking),蒙版操作即为异或 XOR 操作。

如此看来,还是比较麻烦的,幸运的是已经有大神编写了 Python 生成二维码的第三方库,所以我们不需要重复造轮子, 使用现成的库(模块)即可,qrcode库。

安装qrcode库

pip install qrcode

使用 qrcode库产生二维码比较简单。

#导入qrcode库

import qrcode

#生成二维码就是调用这个 make 函数: 

img = qrcode.make('文本')

img.save('路径/图片名称')  #保存二维码

上面两行可以合并为一行

qrcode.make('文本').save('路径/图片名称')

下面给出 sdn网址https://www.csdn.net 的二维码的例子

qrcode.make('https://www.csdn.net/').save('D:/csdn网址二维码.Jpg')

在D:\\可以找到文件 csdn网址二维码.Jpg,参见下图:

 下面介绍qrcode库的高级用法。

先介绍几个qrcode库的常用方法

☆QRCode 方法qrcode.QRCode(

  version=1,

  error_correction=qrcode.ERROR_CORRECT_L,

  box_size=10,

  border=4,

  image_factory=None,

  mask_pattern=None

)

参数说明:

version:控制二维码的大小,取值范围从1到40。取最小值1时,二维码大小为21*21。取值为 None (默认)或者使用fit=true参数(默认)时,二维码会自动调整大小。

error_correction:控制二维码纠错级别。

  ERROR_CORRECT_L:大约7%或者更少的错误会被更正。

  ERROR_CORRECT_M:默认值,大约15%或者更少的错误会被更正。

  ERROR_CORRECT_Q:大约25%或者更少的错误会被更正。

  ERROR_CORRECT_H:大约30%或者更少的错误会被更正。

box_size:控制二维码中每个格子的像素数,默认为 10。

border:控制二维码四周留白包含的格子数,默认为4。

image_factory:选择生成图片的形式,默认为 PIL 图像。

mask_pattern:选择生成图片的的掩模。

☆add_data(str,optimize=20):添加要转换的文字到data参数;如果使用了optimize优化参数,数据将被拆分为多个块来进行优化,以找到一个长度至少为这个值的足够简洁的方式来生成二维码。设置为“0”以避免优化。

☆make(fit=True):当fit参数为真或者没有给出version参数时,将会调用best_fit方法来找到适合数据的最小尺寸。如果没有设置mask_pattern,将会调用best_mask_pattern方法来找到找到最有效的掩模图案。最后将这些数据传递给makeImpl方法来生成二维码。与qrcode本体的make方法不一样的是,这个方法没有任何返回值。

☆make_image(fill_color=None, back_color=None,image_factory=None):创建二维码的图像并返回,默认为 PIL 图像。如果要让二维码有颜色,可以在这里设置fill_color, back_color

下面是带有logo图案的二维码例子

准备一张logo图片

 源码如下:

#带有logo图案的二维码
from PIL import Image
import qrcode

def main():
    #QRCode()这里我们创建了一个对象:
    qr = qrcode.QRCode(version=5,error_correction=qrcode.constants.ERROR_CORRECT_H,box_size=8,border=4)
    #version:值为1~40的整数,控制二维码的大小(最小值是1,是个21×21的矩阵)
    #error_correction:控制二维码的错误纠正功能。可取值下列4个常量: 
    '''
    qrcode.constants.ERROR_CORRECT_X:
        1. X=L时,大约7%或更少的错误能被纠正。 
        2. X=M(默认)时,大约15%或更少的错误能被纠正。
        3. X=Q时,25%以下的错误会被纠正。
        4. X=H时,大约30%或更少的错误能被纠正。
    '''
    #box_size:控制二维码中每个小格子包含的像素数。
    #border:控制边框(二维码与图片边界的距离)包含的格子数(默认为4)


    #向二维码中添加信息
    qr.add_data("https://www.csdn.net/")

    qr.make(fit=True)

    img = qr.make_image()
    #二维码设置为彩色
    img = img.convert('RGBA')
    #打开logo图片
    logo = Image.open("D:/cndsLOGO.png")
    #二维码尺寸
    img_w,img_h = img.size
    #默认LOGO最大设为图片的1/4
    factor = 4
    #最大logo尺寸
    size_w = int(img_w/factor)
    size_h = int(img_h/factor)
    #logo的尺寸
    logo_w,logo_h = logo.size

    if logo_w > size_w or logo_h > size_h:
        logo_w = size_w
        logo_h = size_h
    logo = logo.resize((logo_w,logo_h),Image.ANTIALIAS).convert('RGBA')
    l_w = int((img_w-logo_w)/2)
    l_h = int((img_h-logo_h)/2)
    #替换指定位置
    img.paste(logo,(l_w,l_h),logo)
    img.show()
    img.save('D:/csdn网址二维码2.png')

main()  #调用main()函数

运行结果:

以上是关于使用 Python 生成二维码的主要内容,如果未能解决你的问题,请参考以下文章

编程开发|使用python和女朋友照片生成二维码图片

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

果然够炫酷!用 Python 生成炫酷二维码及解析

vb.netqrcode尺寸大小

python如何通过列表转换为二维码?

vb6.0 利用 qrmaker 生成二维码,如何固定尺寸