您好,登录后才能下订单哦!
# Python中怎么生成二维码
二维码(QR Code)作为一种高效的信息载体,已广泛应用于移动支付、商品溯源、信息传递等领域。Python凭借丰富的第三方库,可以轻松实现二维码的生成与定制。本文将详细介绍5种主流方法,涵盖基础生成、高级美化、动态二维码等场景,并提供完整的代码示例。
## 一、二维码基础概念
### 1.1 二维码工作原理
二维码通过黑白模块的特定排列存储二进制数据,具有以下技术特性:
- **容错机制**:即使部分损坏仍可读取(7%-30%纠错能力)
- **数据模式**:支持数字、字母、汉字(GB18030/UTF-8)及二进制数据
- **版本系统**:从21×21模块(Version 1)到177×177模块(Version 40)
### 1.2 典型应用场景
- 移动支付(微信/支付宝收款码)
- 电子票务(电影票/登机牌)
- 产品防伪(加密二维码)
- Wi-Fi快速连接(编码SSID和密码)
## 二、环境准备
### 2.1 安装核心库
```bash
pip install qrcode pillow numpy svgwrite
# 艺术二维码支持
pip install myqr
# 动态GIF二维码
pip install imageio
import qrcode
def basic_qrcode(text, filename="qrcode.png"):
# 创建QRCode实例
qr = qrcode.QRCode(
version=5, # 控制尺寸(1-40)
error_correction=qrcode.constants.ERROR_CORRECT_H, # 高容错
box_size=10, # 每个模块的像素数
border=4, # 白色边框宽度
)
qr.add_data(text)
qr.make(fit=True) # 自动调整version
img = qr.make_image(fill_color="navy", back_color="white")
img.save(filename)
print(f"二维码已保存为 {filename}")
basic_qrcode("https://www.python.org")
参数 | 说明 | 推荐值 |
---|---|---|
version | 控制二维码尺寸(1-40) | None(自动) |
error_correction | 容错级别:L(7%),M(15%),Q(25%),H(30%) | ERROR_CORRECT_H |
box_size | 每个”点”的像素数 | 6-12 |
border | 白色边框宽度(模块数) | ≥4 |
from PIL import Image
def logo_qrcode(text, logo_path, output="qrcode_logo.png"):
qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_H)
qr.add_data(text)
qr_img = qr.make_image().convert('RGB')
# 添加LOGO
logo = Image.open(logo_path)
logo_size = min(qr_img.size) // 4 # LOGO尺寸控制
logo = logo.resize((logo_size, logo_size), Image.Resampling.LANCZOS)
# 计算粘贴位置
pos = ((qr_img.size[0] - logo.size[0]) // 2,
(qr_img.size[1] - logo.size[1]) // 2)
qr_img.paste(logo, pos)
qr_img.save(output)
logo_qrcode("PYTHON ROCKS!", "python-logo.png")
def styled_qrcode(text, output="styled_qr.png"):
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers import (
CircleModuleDrawer,
RoundedModuleDrawer
)
qr = qrcode.QRCode()
qr.add_data(text)
# 使用圆形模块
img = qr.make_image(
image_factory=StyledPilImage,
module_drawer=CircleModuleDrawer(),
eye_drawer=RoundedModuleDrawer(radius_ratio=1.2),
color_mask=qrcode.image.styles.colormasks.SolidFillColorMask(
front_color=(70, 130, 180) # 钢蓝色
)
)
img.save(output)
def gradient_qrcode(text, output="gradient_qr.png"):
import numpy as np
from PIL import Image, ImageDraw
qr = qrcode.QRCode(box_size=15)
qr.add_data(text)
matrix = qr.get_matrix()
# 创建渐变画布
size = len(matrix) * 15
img = Image.new('RGB', (size, size))
draw = ImageDraw.Draw(img)
# 生成渐变颜色
for i in range(size):
r = int(255 * i/size)
g = int(128 + 127 * np.sin(i/20))
b = int(255 * (1 - i/size))
draw.line([(i,0), (i,size)], fill=(r,g,b))
# 应用二维码蒙版
for y in range(len(matrix)):
for x in range(len(matrix)):
if matrix[y][x]:
draw.rectangle(
[(x*15, y*15), ((x+1)*15, (y+1)*15)],
fill='black'
)
img.save(output)
def animated_qrcode(text, output="animated_qr.gif"):
import imageio
from PIL import Image, ImageSequence
frames = []
colors = ['red', 'blue', 'green', 'purple']
for color in colors:
qr = qrcode.QRCode()
qr.add_data(text)
img = qr.make_image(fill_color=color)
frames.append(img.convert('P'))
# 保存为GIF
frames[0].save(
output,
save_all=True,
append_images=frames[1:],
duration=500,
loop=0,
optimize=True
)
import pandas as pd
def batch_generate(csv_file):
df = pd.read_csv(csv_file)
for _, row in df.iterrows():
basic_qrcode(
text=row['url'],
filename=f"{row['id']}.png"
)
# CSV格式示例:
# id,url,description
# 1,https://example.com/page1,Product Page
# Flask示例
from flask import Flask, send_file
import io
app = Flask(__name__)
@app.route('/qr/<text>')
def generate_qr(text):
qr = qrcode.QRCode()
qr.add_data(text)
img = qr.make_image()
img_io = io.BytesIO()
img.save(img_io, 'PNG')
img_io.seek(0)
return send_file(img_io, mimetype='image/png')
if __name__ == '__main__':
app.run()
尺寸选择:根据内容长度选择合适的version
缓存机制:对固定内容二维码进行本地存储
异步生成:使用Celery等工具处理批量任务
# Celery任务示例
from celery import Celery
app = Celery('tasks', broker='pyamqp://guest@localhost//')
@app.task
def async_qr_gen(text, filename):
basic_qrcode(text, filename)
def is_safe_url(url): return urlparse(url).scheme in (‘http’, ‘https’)
2. **敏感数据加密**:对包含个人信息的二维码进行AES加密
```python
from Crypto.Cipher import AES
def encrypt_data(key, data):
cipher = AES.new(key, AES.MODE_EAX)
ciphertext, tag = cipher.encrypt_and_digest(data.encode())
return cipher.nonce + tag + ciphertext
def expiring_qrcode(text, hours=24): expiry = datetime.now() + timedelta(hours=hours) return f”{text}?exp={int(expiry.timestamp())}”
## 九、扩展应用场景
### 9.1 微信小程序码生成
```python
import requests
def weapp_qrcode(access_token, path, width=430):
url = f"https://api.weixin.qq.com/wxa/getwxacode?access_token={access_token}"
response = requests.post(url, json={
"path": path,
"width": width
})
with open("weapp_qr.png", "wb") as f:
f.write(response.content)
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
def pdf_with_qr(text, filename="output.pdf"):
c = canvas.Canvas(filename, pagesize=A4)
# 生成临时二维码
qr_img = qrcode.make(text)
qr_img.save("temp.png")
# 插入PDF
c.drawImage("temp.png", 100, 700, width=100, height=100)
c.drawString(100, 680, "Scan this QR Code")
c.save()
import tkinter as tk
from tkinter import filedialog
from PIL import ImageTk
class QRGeneratorApp:
def __init__(self, master):
self.master = master
master.title("QR Code Generator")
# 控件初始化
self.text_var = tk.StringVar()
self.color_var = tk.StringVar(value="black")
tk.Label(master, text="输入内容:").pack()
tk.Entry(master, textvariable=self.text_var, width=40).pack()
tk.Label(master, text="选择颜色:").pack()
tk.OptionMenu(master, self.color_var, "black", "red", "blue", "green").pack()
tk.Button(master, text="生成二维码", command=self.generate).pack()
self.img_label = tk.Label(master)
self.img_label.pack()
def generate(self):
qr = qrcode.QRCode()
qr.add_data(self.text_var.get())
img = qr.make_image(fill_color=self.color_var.get())
# 显示预览
tk_img = ImageTk.PhotoImage(img)
self.img_label.config(image=tk_img)
self.img_label.image = tk_img
# 保存文件
filename = filedialog.asksaveasfilename(defaultextension=".png")
if filename:
img.save(filename)
if __name__ == "__main__":
root = tk.Tk()
app = QRGeneratorApp(root)
root.mainloop()
本文系统介绍了Python生成二维码的多种方法,从基础的qrcode库使用到高级的动态二维码实现,涵盖了: - 不同容错级别的设置 - 视觉美化技巧(颜色、形状、LOGO) - 批量生成与自动化方案 - 安全防护措施 - 企业级应用集成
建议根据实际需求选择合适的实现方式,对于高频使用场景可考虑使用Redis缓存已生成的二维码。完整的示例代码已托管在GitHub仓库供参考。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。