怎样用Python 生成二维码
1,首先了解一下二维码的基础知识
二维码是用某种特定的几何图形按一定规律在平面(也即二维方向上)分布的黑白相间的图形记录数据符号信息的,它利用了计算机内部逻辑“0”“1”的概念,用几个与二进制相对应的几何图形来表示文字信息,每种码都有特定的字符集。根据标准(ISO/IEC 18004),我们可以了解到 QR 码结构如下:
2,各部分解析:
位置探测图形:由三个黑白相间的大正方形嵌套组成,分别位于二维码左上角、右上角、左下角,目的是为了确定二维码的大小和位置。
定位图形 :由两条黑白相间的直线组成,便于确定二维码的角度,纠正扭曲。
校正图形 :仅在版本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()函数
二维码是用某种特定的几何图形按一定规律在平面(也即二维方向上)分布的黑白相间的图形记录数据符号信息的,它利用了计算机内部逻辑“0”“1”的概念,用几个与二进制相对应的几何图形来表示文字信息,每种码都有特定的字符集。根据标准(ISO/IEC 18004),我们可以了解到 QR 码结构如下:
2,各部分解析:
位置探测图形:由三个黑白相间的大正方形嵌套组成,分别位于二维码左上角、右上角、左下角,目的是为了确定二维码的大小和位置。
定位图形 :由两条黑白相间的直线组成,便于确定二维码的角度,纠正扭曲。
校正图形 :仅在版本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()函数