前言
现如今,生活中使用到二维码的场景可以说随处可见。特别是手机支付中,通过手机扫描二维码跳转到支付页面,这种场景相信大家不会陌生。
我们日常最常使用到的二维码是矩阵式二维条码(又称棋盘式二维条码)。它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。
那么让我们来扒一扒如何使用 Python 生成二维码图片。
一、简单生成二维码
- 安装qrcode库
pip install qrcode
因为国内网速的原因,有时下载会超时,建议使用国内的pip源
pip install qrcode -i https://pypi.douban.com/simple
qrcode 依赖 Image 这个包,所以也要安装一个这个包,一样网速慢,建议使用国内的pip源
pip install Image -i https://pypi.douban.com/simple
- 生成一个简单的二维码
安装完毕后,咱们生成个简单的二维码试试。(我用的博客主页地址偷偷生成了一个二维码[狗头][狗头])
data = "https://blog.csdn.net/m1090760001"
img = qrcode.make(data)
img.show()
img.save("qr_code.png")
运行一下试试效果
- 生成二维码的一般步骤:
- 创建QRCode对象
- add_data()添加数据
- make_image()创建二维码(返回im类型的图片对象)
- 自动打开图片,im.show()
上面案例中,我们只使用了img = qrcode.make(data)就实现了一个二维码的生成,原因是qrcode提供简单调用接口。其实你查看源码就可以看到:
def make(data=None, **kwargs):
qr = QRCode(**kwargs)
qr.add_data(data)
return qr.make_image()
二、自定义二维码
如果想生成一个比较复杂的二维码,就要知道怎么去设置相关的属性。
扫描二维码关注公众号,回复:
9722817 查看本文章
- 基本的参数:
- version: 一个整数,范围为1到40,表示二维码的大小(最小值是1,是个12×12的矩阵),如果想让程序自动生成,将值设置为 None 并使用 fit=True 参数即可。(默认情况是程序自动生成)
- error_correction: 二维码的纠错范围,可以选择4个常量:
属性 | 描述 |
---|---|
ERROR_CORRECT_L | 7%以下的错误会被纠正 |
ERROR_CORRECT_M | 15%以下的错误会被纠正(默认) |
ERROR_CORRECT_Q | 25 %以下的错误会被纠正 |
ERROR_CORRECT_H | 30%以下的错误会被纠正 |
- boxsize: 每个点(方块)中的像素个数
- border: 二维码距图像外围边框距离,默认为4,而且相关规定最小为4
- 设置填充格的颜色,设置二维码背景色
# 设置红色的填充格,背景色为白色的二维码
img = qr.make_image(fill_color="red", back_color="white")
3. 在二维码中加一张图片
可以利用PIL库中image模块的paste函数
# img为二维码图片对象,path标识要添加的图片对象,where表示图片位置
img.paste(path,where,mask=None)
其中,img为image对象;path为所添加图片;where为tuple,如:(x,y),表示图片所在二维码的横纵坐标。
实现比较复杂,请查看实战部分源码,谢谢!
三、实战
# -*- coding: utf-8 -*-
# 生成二维码
import qrcode
from PIL import Image
# 生成二维码
def mark_qrcode(data):
img = qrcode.make(data)
img.show()
img.save("qr_code.png")
def mark_my_qrcode(data):
qr = qrcode.QRCode(
version=4,
error_correction=qrcode.constants.ERROR_CORRECT_H,
border=4,
)
qr.add_data(data)
qr.make(fit=True)
# 设置红色白底的二维码
img = qr.make_image(fill_color="red", back_color="white")
img_w, img_h = img.size
# 获取logo
icon = Image.open("m1090760001.jpg")
icon_w, icon_h = icon.size
# 设置图片最大尺寸6:1
factor = 6
size_w = int(img_w / factor)
size_h = int(img_h / factor)
if icon_w > size_w:
icon_w = size_w
if icon_h > size_h:
icon_h = size_h
# 压缩图片
icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)
# 获取中心的坐标
c_w = int((img_w - icon_w) / 2)
c_h = int((img_h - icon_h) / 2)
img.paste(icon, (c_w, c_h), mask=None)
img.show()
if __name__ == "__main__":
data = "https://blog.csdn.net/m1090760001"
# mark_qrcode()
mark_my_qrcode(data)
生成图片的实际效果如下(读者在运行上面代码是请先准备一张图片,不然会报错):