python二维码的生成与解码

关于此项功能在于参考了Umi-OCR的开源软件,生成QRCODE类型的二维码,以及相关的解码手段。在生成阶段主要通过 :

import qrcode
直接pip即可,指令为pip install qrcode;而在解码阶段则使用的是:
import zxingcpp

注意指令为pip install zxing-cpp:

界面简要

代码合集:

import cv2
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QHBoxLayout, QLineEdit, QPushButton, \
    QWidget, QFileDialog
from PyQt5.QtGui import QPixmap, QMouseEvent
from PyQt5.QtCore import Qt
import sys
import qrcode
from PIL import Image
import zxingcpp


class ClickableLabel(QLabel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.qr_image_path = None

    def set_qr_image_path(self, path):
        self.qr_image_path = path

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton and self.qr_image_path:
            save_path, _ = QFileDialog.getSaveFileName(self, "保存二维码", "qrcode.png",
                                                       "Images (*.png *.xpm *.jpg *.jpeg *.bmp)")
            if save_path:
                img = Image.open(self.qr_image_path)
                img.save(save_path)
                print(f"二维码已保存至: {save_path}")
        else:
            super().mousePressEvent(event)


class QRCodeApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("二维码生成与扫描")
        self.setGeometry(300, 300, 800, 600)

        self.initUI()

    def initUI(self):
        # 设置主布局
        main_layout = QVBoxLayout()

        # 二维码生成部分
        generate_layout = QHBoxLayout()
        self.input_text = QLineEdit(self)
        self.input_text.setPlaceholderText("输入要编码的文本")
        self.generate_btn = QPushButton("生成二维码", self)
        self.generate_btn.clicked.connect(self.generate_qrcode)
        generate_layout.addWidget(self.input_text)
        generate_layout.addWidget(self.generate_btn)

        # 显示生成的二维码
        self.qr_label = ClickableLabel(self)
        self.qr_label.setAlignment(Qt.AlignCenter)
        self.qr_label.setText("二维码生成后显示在此处")

        # 二维码扫描部分
        scan_layout = QHBoxLayout()
        self.scan_btn = QPushButton("选择二维码图片", self)
        self.scan_btn.clicked.connect(self.scan_qrcode)
        self.scan_result = QLabel(self)
        self.scan_result.setAlignment(Qt.AlignCenter)
        self.scan_result.setText("扫描结果显示在此处")
        scan_layout.addWidget(self.scan_btn)
        scan_layout.addWidget(self.scan_result)

        # 添加各部分到主布局
        main_layout.addLayout(generate_layout)
        main_layout.addWidget(self.qr_label)
        main_layout.addLayout(scan_layout)

        # 创建主窗口
        container = QWidget()
        container.setLayout(main_layout)
        self.setCentralWidget(container)

    def generate_qrcode(self):
        text = self.input_text.text()
        if not text:
            self.qr_label.setText("请输入有效的文本")
            return

        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=10,
            border=4,
        )
        qr.add_data(text)
        qr.make(fit=True)

        img = qr.make_image(fill_color="black", back_color="white")
        img_path = "generated_qrcode.png"
        img.save(img_path)

        self.qr_label.set_qr_image_path(img_path)

        pixmap = QPixmap(img_path)
        self.qr_label.setPixmap(pixmap)

    import cv2

    def scan_qrcode(self):
        file_path, _ = QFileDialog.getOpenFileName(self, "选择二维码图片", "", "Images (*.png *.xpm *.jpg *.jpeg *.bmp)")
        if file_path:
            try:
                # 使用 cv2 加载图像
                image = cv2.imread(file_path)
                if image is None:
                    self.scan_result.setText("无法加载图像")
                    return

                # 使用 zxingcpp 解码图像
                img = zxingcpp.read_barcodes(image)

                if img:
                    result = img[0].text
                    self.scan_result.setText(f"扫描结果: {result}")
                else:
                    self.scan_result.setText("无法读取二维码")
            except Exception as e:
                print(e)
                self.scan_result.setText(f"读取错误: {e}")
        else:
            self.scan_result.setText("未选择文件")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = QRCodeApp()
    ex.show()
    sys.exit(app.exec_())

解释:

1. ClickableLabel

这是一个自定义的 QLabel 类,用于显示生成的二维码图像,并在用户点击时保存该图像。

  • set_qr_image_path(self, path): 设置二维码图像的路径。
  • mousePressEvent(self, event): 处理鼠标点击事件,当左键点击时,如果有二维码图像路径,则打开文件保存对话框,保存二维码图像。

2. QRCodeApp

这是主窗口类,继承自 QMainWindow,包含二维码生成和扫描的所有功能。

  • __init__(self): 初始化主窗口,设置窗口标题和大小,并调用 initUI() 方法设置界面。
  • initUI(self): 设置主界面的布局,包括输入文本、生成按钮、二维码显示区域、扫描按钮和扫描结果显示区域。
    • generate_layout: 水平布局,包含文本输入框和生成按钮。
    • qr_label: 用于显示生成的二维码,是 ClickableLabel 的实例。
    • scan_layout: 水平布局,包含扫描按钮和显示扫描结果的标签。

3. 生成二维码功能

  • generate_qrcode(self):
    • 获取输入的文本,如果文本为空,显示提示信息。
    • 使用 qrcode 库生成二维码图像,并保存到本地文件 generated_qrcode.png
    • 设置 qr_label 显示生成的二维码图像,并将图像路径存储在 qr_label 中。

4. 扫描二维码功能

  • scan_qrcode(self):
    • 打开文件选择对话框,选择要扫描的二维码图片。
    • 使用 OpenCV (cv2) 加载图像文件。
    • 使用 zxingcpp 库解码二维码图像。
    • 显示解码结果,如果解码失败,显示相应的错误信息。

以供参考!!

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值