生成二维码

1. 什么是QRCode

用来生成二维码的

2. 前端生成二维码

2.1 下载qrcode.min.js

https://github.com/davidshimjs/qrcodejs

2.2 引入qrcode.min.js

用法1:

<div id="qrcode"></div>

<script type="text/javascript">
	new QRCode(document.getElementById("qrcode"), "http://www.runoob.com");	//要生成二维码的链接
</script>

用法2:

var qrcode = new QRCode("test", {
    text: "http://www.runoob.com",	//要生成二维码的链接
    width: 128,	//二维码的宽度
    height: 128,	//二维码的高度
    colorDark : "#000000",	//前景色
    colorLight : "#ffffff",	//背景色
    correctLevel : QRCode.CorrectLevel.H	//纠错等级
});

用法3:

qrcode.makeCode("http://www.w3cschool.cc"); //要生成二维码的链接

2.3 纠错等级

二维码容错率即是指二维码图标被遮挡多少后,仍可以被扫描出来的能力。容错率越高,则二维码图片能被遮挡的部分越多。

容错原理:

容错的原理是二维码在编码过程中进行了冗余,就像是123被编码成123123,这样只要扫描到一部分二维码图片,二维码内容还是可以被全部读到。大多数情况下,我们强烈建议采用30%的容错率(对目前主流手机,在绝大多数扫描场景下,容错率越高,越容易被快速扫描!!!)

correctLevel : QRErrorCorrectLevel.L, (7%)
correctLevel : QRErrorCorrectLevel.M, (15%)
correctLevel : QRErrorCorrectLevel.Q, (25%)
correctLevel : QRErrorCorrectLevel.H, (30%)

3. 后端生成二维码

3.1 模块下载

pip install qrcode

3.2 代码示例及参数说明

import qrcode

qr = qrcode.QRCode(version=1, box_size=10, border=5)

data = "https://www.jd.com"
qr.add_data(data)

qr.make(fit=True)
qr.clear()  # 清空数据
# ewm_list = qr.get_matrix()  # 获取二维码数组
img = qr.make_image(fill_color="black", back_color="white")  # 更改二维码的颜色,默认是黑色
img.save("qrcode.png")

微信或者手机浏览器扫描该二维码,会跳转到百度页面。本质而言,扫二维码就是得到内容,而不会跳转什么页面。微信或者手机浏览器器会跳转,是因为它们添加了如果扫描二维码结果是url就自动跳转的代码造成的。

参数说明

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

方法说明:

  1. add_data(data,optimize=20):``添加要转换的数据到data参数;如果使用了optimize优化参数,数据将被拆分为多个块来进行优化,以找到一个长度至少为这个值的足够简洁的方式来生成二维码。设置为“0”以避免优化。 make(fit=True):当fit参数为真或者QRCode 对象没有给出version参数时,将会调用best_fit方法来找到适合数据的最小尺寸。如果QRCode 对象没有设置mask_pattern,将会调用best_mask_pattern方法来找到找到最有效的掩模图案。最后将这些数据传递给makeImpl方法来生成二维码。与qrcode本体的make方法不一样的是,这个方法没有任何返回值。
  2. make_image( fill_color=None, back_color=None,image_factory=None ):``创建二维码的图像并返回,默认为 PIL 图像。颜色值可以是单词,也可以是 #RRGGBB 模式。一般就用前面的两个参数,后面这个默认吧,不用搞那么复杂。

其他方法:

  1. clear:``清空数据
  2. get_matrix:``返回二维码数组。
  3. print_ascii(out=None, tty=False, invert=False):``这个方法用字符画的形式来输出二维码,但是扫的时候一般都扫不出来,很多时候看上去是乱的,也就看看样子用。

3.3 另一种保存方式

import qrcode

qr = qrcode.QRCode(version=1, box_size=10, border=5)

data = "https://www.jd.com"
qr.add_data(data)

qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.show()
with open("2.png", "wb") as f:
    img.save(f)

3.4 二维码中间带图标

简单来讲,就是用小图标直接贴在二维码中。虽然二维码被盖住了一部分,但是因为二维码有一个容错率,所以依然可以扫出来。因此,不建议图标太大,太大了二维码容错率就不行了。所以,二维码中带图标,一般要设置高容错率( ERROR_CORRECT_H )。经过测试,自己丈量,小图片是二维码图片宽高的 六分之一最合适。

一般情况是把图标放入二维码中的正中间:

绿色块的左上角 x 坐标是 (二维码图片宽 - 图标宽) /2 ,y 坐标同理推得。

所以整体思路是:

  1. 先获取二维码,并得到它的宽高;
  2. 利用二维码宽高,计算出图标宽高;
  3. 利用PIL 的 Image.open 方法,打开图标图片,并进行缩放到适当大小。
  4. 把图标“粘贴”进入二维码:利用 PIL 对象的 paste 粘贴方法
  5. 把整合的图片保存下来:利用 PIL对象的save 方法。

举例代码:实现准备好一个图标文件,正方形的。我这里是 girl.jpg 文件。

import os , qrcode
from PIL import  Image

import qrcode,os
# 创建QRCode对象
ewm = qrcode.QRCode(
    version=5,
    error_correction=qrcode.constants.ERROR_CORRECT_H,
    box_size=10,
    border=4,
)
# 设置二维码数据, 并添加到二维码中
data = "https://www.baidu.com"
ewm.add_data(data=data)
# 更改二维码的颜色,默认是黑色。得到的结果是 PIL 图像对象
ewm.make(fit=True) # 让二维码得到一个适合的大小值。
ewm_img = ewm.make_image(fill_color="#ff3300", back_color="white")
# 获取二维码大小:宽,高
ewm_size = ewm_img.size
ewm_size_w ,ewm_size_h = ewm_size

# 打开图标文件,并获取图标的大小,重新设定图标大小
# 这里设置icon宽高为二维码的 6分之一。
s = 6
icon = Image.open("girl.png")
# 设置小图标的大小,缩放的时候尺寸必须是整数,否则报错
icon_w,icon_h = int(ewm_size_w/s) ,int(ewm_size_h/s)
icon_small = icon.resize( (icon_w ,icon_h) ,Image.ANTIALIAS)  # Image.ANTIALIAS 画面平滑缩放
# 获取粘贴小图标的坐标,必须整数,否则粘贴的时候,报错
icon_x, icon_y = int( (ewm_size_w-icon_w)/2 ), int( (ewm_size_h-icon_h)/2)
# 把图标“粘贴”到二维码上正中间。
ewm_img.paste( icon_small,(icon_x,icon_y)  )

# 显示二维码
ewm_img.show()    # 如果数据被clear了,会有个二维码,扫它什么都不会发生
ewm_img.save("girl_ewm.jpg")

这里用到了 PIL 的 Image 对象。用到了它的 open() , resize() , paste() 方法。这里就不详细说它们了,具体看注释,比较简单。

posted @ 2023-11-13 15:26  河图s  阅读(124)  评论(0)    收藏  举报