# Python中怎么生成二維碼
二維碼(QR Code)作為一種高效的信息載體,已廣泛應用于移動支付、商品溯源、信息傳遞等領域。Python憑借豐富的第三方庫,可以輕松實現二維碼的生成與定制。本文將詳細介紹5種主流方法,涵蓋基礎生成、高級美化、動態二維碼等場景,并提供完整的代碼示例。
## 一、二維碼基礎概念
### 1.1 二維碼工作原理
二維碼通過黑白模塊的特定排列存儲二進制數據,具有以下技術特性:
- **容錯機制**:即使部分損壞仍可讀?。?%-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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。