溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中怎么生成二維碼

發布時間:2021-07-05 15:00:04 來源:億速云 閱讀:254 作者:Leah 欄目:大數據
# 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

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倉庫供參考。 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女