Python中怎么生成二维码

发布时间:2021-07-05 15:00:04 作者:Leah
来源:亿速云 阅读:236
# 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

2.2 可选功能扩展

# 艺术二维码支持
pip install myqr 
# 动态GIF二维码
pip install imageio

三、基础二维码生成

3.1 使用qrcode库

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")

3.2 参数详解

参数 说明 推荐值
version 控制二维码尺寸(1-40) None(自动)
error_correction 容错级别:L(7%),M(15%),Q(25%),H(30%) ERROR_CORRECT_H
box_size 每个”点”的像素数 6-12
border 白色边框宽度(模块数) ≥4

四、高级定制化方案

4.1 嵌入LOGO

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")

4.2 样式美化

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)

五、特殊类型二维码

5.1 彩色渐变二维码

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)

5.2 动态GIF二维码

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
    )

六、批量生成与自动化

6.1 批量生成工具

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

6.2 与Web框架集成

# 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()

七、性能优化建议

  1. 尺寸选择:根据内容长度选择合适的version

    • 纯数字:最多7089字符
    • 字母数字:最多4296字符
    • 二进制数据:最多2953字节
  2. 缓存机制:对固定内容二维码进行本地存储

  3. 异步生成:使用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)

八、安全注意事项

  1. 内容验证:防止生成恶意URL二维码 “`python from urllib.parse import urlparse

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
  1. 访问控制:动态二维码设置有效期 “`python import time from datetime import datetime, timedelta

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)

9.2 PDF嵌入二维码

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()

十、完整项目示例

10.1 带GUI的二维码生成器

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仓库供参考。 “`

推荐阅读:
  1. ios中怎么扫描与生成二维码
  2. Python 中怎么生成二维码

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:flask蓝图的使用方法

下一篇:Python中“is”和“==”的区别是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》