将PyQt4.QtGui.QImage对象转化为base64字符串

本文介绍了如何在PyQt4项目中将QtGui.QImage对象转换为base64字符串,主要应用于网页截屏场景。首先描述了问题背景,即需要将截屏得到的QImage对象转化为能用于网页展示的base64格式。解决方案包括将QImage对象转换为ByteArray,以PNG格式保存,然后使用base64编码生成字符串。

将PyQt4.QtGui.QImage对象转化为base64字符串

问题描述

  在做网页截屏项目时,遇到了一个问题,就是要将截屏得到的图片转化为 base64 加密的字符串。我在进行截屏时,使用的是定义一个与网页大小相同的QImage对象,然后用QPainter将网页内容画到QImage上的方法。这时,就需要将QImage对象转化为 base64 字符串。

解决方法

 #size为网页大小
 img = QtGui.QImage(size, QtGui.QImage.Format_ARGB32)
 painter = QtGui.QPainter(img)
 self.webPage.mainFrame().render(painter)
 painter.end()
 #QImage通过ByteArray转化为BASE64字符串
 data = QtCore.QByteArray()<
import sys print(sys.path) print(sys.version) from PyQt5.QtWidgets import (QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, QHBoxLayout, QStatusBar, QMessageBox) from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtCore import Qt, QTimer from processes.init import ProcessManager from gui.query_widget import QueryWidget from config import Config from enum import Enum from qfluentwidgets import StyleSheetBase, Theme, isDarkTheme, qconfig class StyleSheet(StyleSheetBase, Enum): """ Style sheet """ MAIN_WINDOW = "main_window" def path(self, theme=Theme.DARK): theme = qconfig.theme if theme == Theme.AUTO else theme return f"app/resource/qss/{theme.value.lower()}/{self.value}.qss" class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("工牌识别打卡系统") self.setGeometry(100, 100, 1200, 800) # apply style sheet to main window StyleSheet.MAIN_WINDOW.apply(self) # 初始化进程管理器 self.process_manager = ProcessManager() # 创建主选项卡 self.tabs = QTabWidget() self.setCentralWidget(self.tabs) # 实时识别选项卡 self.real_time_tab = QWidget() self.init_real_time_tab() # 数据查询选项卡 self.query_tab = QueryWidget(self.process_manager.db_manager) self.tabs.addTab(self.real_time_tab, "实时识别") self.tabs.addTab(self.query_tab, "打卡记录") # 状态栏 self.status_bar = QStatusBar() self.setStatusBar(self.status_bar) self.status_bar.showMessage("系统就绪") # 连接信号 self.start_btn.clicked.connect(self.start_recognition) self.stop_btn.clicked.connect(self.stop_recognition) # 初始化定时器 self.timer = QTimer() self.timer.timeout.connect(self.update_frame) self.recognition_active = False def init_real_time_tab(self): layout = QVBoxLayout() # 视频显示区域 self.video_label = QLabel() self.video_label.setAlignment(Qt.AlignCenter) self.video_label.setMinimumSize(800, 600) self.video_label.setText("摄像头未启动") layout.addWidget(self.video_label) # 控制按钮区域 btn_layout = QHBoxLayout() self.start_btn = QPushButton("开始识别") self.stop_btn = QPushButton("停止识别") self.stop_btn.setEnabled(False) btn_layout.addWidget(self.start_btn) btn_layout.addWidget(self.stop_btn) layout.addLayout(btn_layout) # 识别结果区域 result_layout = QHBoxLayout() self.face_label = QLabel() self.face_label.setAlignment(Qt.AlignCenter) self.face_label.setMinimumSize(200, 200) self.face_label.setText("头像") result_layout.addWidget(self.face_label) info_layout = QVBoxLayout() self.id_label = QLabel("工号:") self.name_label = QLabel("姓名:") self.time_label = QLabel("时间:") self.status_label = QLabel("状态:等待识别...") info_layout.addWidget(self.id_label) info_layout.addWidget(self.name_label) info_layout.addWidget(self.time_label) info_layout.addWidget(self.status_label) result_layout.addLayout(info_layout) layout.addLayout(result_layout) self.real_time_tab.setLayout(layout) def start_recognition(self): """启动识别过程""" try: self.process_manager.start_processes() self.recognition_active = True self.timer.start(30) # ≈33ms/frame self.start_btn.setEnabled(False) self.stop_btn.setEnabled(True) self.status_label.setText("状态:识别中...") self.status_bar.showMessage("识别已启动") except Exception as e: QMessageBox.critical(self, "启动错误", f"无法启动识别进程: {str(e)}") def stop_recognition(self): """停止识别过程""" self.recognition_active = False self.timer.stop() self.process_manager.stop_processes() self.start_btn.setEnabled(True) self.stop_btn.setEnabled(False) self.status_label.setText("状态:已停止") self.status_bar.showMessage("识别已停止") def update_frame(self): """更新视频帧和识别结果""" # 获取最新帧 if not self.process_manager.frame_queue.empty(): frame = self.process_manager.frame_queue.get() height, width, channel = frame.shape bytes_per_line = 3 * width q_img = QImage(frame.data, width, height, bytes_per_line, QImage.Format_RGB888) pixmap = QPixmap.fromImage(q_img) self.video_label.setPixmap(pixmap.scaled( self.video_label.width(), self.video_label.height(), Qt.KeepAspectRatio)) # 获取识别结果 if not self.process_manager.result_queue.empty(): result = self.process_manager.result_queue.get() if result['status'] == 'success': self.id_label.setText(f"工号:{result['badge_id']}") self.name_label.setText(f"姓名:{result['name']}") self.time_label.setText(f"时间:{result['time']}") self.status_label.setText("状态:打卡成功!") # 显示头像 if result['face_path']: pixmap = QPixmap(result['face_path']) self.face_label.setPixmap(pixmap.scaled(200, 200, Qt.KeepAspectRatio)) # 更新查询界面 self.query_tab.load_records() def closeEvent(self, event): """窗口关闭时清理资源""" self.stop_recognition() self.process_manager.cleanup() event.accept() 报错QIODevice::read (QFile, "app\resource\qss\light\main_window.qss"): device not open怎么解决?
最新发布
08-21
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值