微信扫一扫 分享朋友圈

已有 285 人浏览分享

开启左侧

怎样用Python 生成二维码

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

2,各部分解析:
位置探测图形:由三个黑白相间的大正方形嵌套组成,分别位于二维码左上角、右上角、左下角,目的是为了确定二维码的大小和位置。
定位图形 :由两条黑白相间的直线组成,便于确定二维码的角度,纠正扭曲。
校正图形 :仅在版本2以上存在,由三个黑白相间的小正方形嵌套组成,便于确定中心,纠正扭曲。
数据和纠错码:记录数据信息和相应的纠错码,纠错码的存在使当二维码的数据出现允许范围内的错误时,也可以正确解码。
版本信息 :仅在版本7以上存在,记录具体的版本信息。
格式信息 :记录使用的掩码和纠错等级。
格式信息、版本信息、数据和纠错码字三部分构成编码区域。
二维码已经有一套国际标准了,所以绘制二维码的过程要严格按照标准来执行。这个过程比较复杂,下面总结出了大致绘制过程。
二维码的绘制大概过程如下:
在二维码的左上角、左下角、右上角绘制位置探测图形,位置探测图形一定是一个 7x7 的矩阵;
绘制校正图形,校正图形一定是一个 5x5 的矩阵;
绘制两条连接三个位置探测图形的定位图形;
在上述图片的基础上,继续绘制格式信息;
接着绘制版本信息;
填充数据码和纠错码到二维码图中;
最后绘制蒙版图案。因为按照上述方式填充内容,可能会出现大面积空白或黑块的情况,导致扫描识别十分困难。所以需要对整个图像与蒙版进行蒙版操作(Masking),蒙版操作即为异或 XOR 操作。
如此看来,还是比较麻烦的,幸运的是已经有大神编写了 Python 生成二维码的第三方库,所以我们不需要重复造轮子, 使用现成的库(模块)即可,如qrcode库。
安装qrcode库
pip install qrcode
image.png
使用 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')
image.png
在D:\可以找到文件 csdn网址二维码.Jpg,参见下图:
image.png
下面介绍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()函数




免责声明:
1,海欣资源网所发布的资源由网友上传和分享,不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
2,海欣资源网的资源来源于网友分享,仅限用于学习交流和测试研究目的,不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
3,海欣资源网所发布的资源由网友上传和分享,版权争议与本站无关,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。
4,如果您喜欢,请支持正版,购买正版,得到更好的正版服务,如有侵权,请联系我们删除并予以真诚的道歉,联系方式邮箱 haixinst@qq.com
海欣资源-企业信息化分享平台。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

43

主题
热度排行
回复排行
最新贴子

Archiver|手机版|海欣资源 ( 湘ICP备2021008090号-1 )|网站地图

GMT+8, 2024-11-21 15:53 , Gzip On, MemCached On.

免责声明:本站所发布的资源和文章均来自网络,仅限用于学习交流和测试研究目的,不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 本站信息来自网络,版权争议与本站无关,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 如果您喜欢,请支持正版,购买正版,得到更好的正版服务,如有侵权,请联系我们删除并予以真诚的道歉。