现如今,生活中使用到二维码的场景可以说随处可见。特别是手机支付中,通过手机扫描二维码跳转到支付页面,这种场景相信大家不会陌生。
我们日常最常使用到的二维码是矩阵式二维条码(又称棋盘式二维条码)。它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。
那么让我们来扒一扒如何使用 Python 生成二维码图片。
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")
上面案例中,我们只使用了img = qrcode.make(data)就实现了一个二维码的生成,原因是qrcode提供简单调用接口。其实你查看源码就可以看到:
def make(data=None, **kwargs):
qr = QRCode(**kwargs)
qr.add_data(data)
return qr.make_image()
如果想生成一个比较复杂的二维码,就要知道怎么去设置相关的属性。
属性 | 描述 |
---|---|
ERROR_CORRECT_L | 7%以下的错误会被纠正 |
ERROR_CORRECT_M | 15%以下的错误会被纠正(默认) |
ERROR_CORRECT_Q | 25 %以下的错误会被纠正 |
ERROR_CORRECT_H | 30%以下的错误会被纠正 |
# 设置红色的填充格,背景色为白色的二维码
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)