⽬录
前⾔安装
条码SDK
从屏幕扫描⼆维码添加⽤于剪切事件的按钮创建⾃定义Qt⼩部件拍摄屏幕图像隐藏和显⽰应⽤程序窗⼝测试屏幕⼆维码阅读器总结
前⾔
⽇常⽣活中,我们通常会拿出智能⼿机扫描⼆维码。但是当我们在电脑上⼯作时,⼿机可能不是扫描⽹页上出现的⼆维码的最佳选择。
原因⼀:从显⽰器屏幕上拍摄的照⽚具有⼲扰 QR 码识别的莫尔图案。
原因⼆:你可能希望直接在 PC 上使⽤解码后的信息,例如⽤于打开⽹站的 URL。本⽂将使⽤ Python 实现⼀个简单的⼯具,以⽅便在桌⾯屏幕上识别⼆维码。
安装
所需的 Python 包包括PIL、OpenCV、Dynamsoft Barcode Reader和Qt。
python3 -m pip install pillow opencv-python dbr pyside2
条码 SDK
需要解锁Dynamsoft Barcode SDK 的功能,您可以申请30 天免费试⽤许可。
从屏幕扫描⼆维码
由于我已经使⽤ Qt for Python、OpenCV 和 Dynamsoft Barcode Reader实现了⼀个GUI 条形码阅读器,剩下的就是添加屏幕截图功能。实现截图功能的步骤:
创建⼀个⾃定义 Qt ⼩部件并将其放在屏幕顶部。paintEvent()在移动⿏标的同时绘制所选区域的功能。
释放⿏标后,调⽤PIL.ImageGrab.grab()以获取所选区域的图像。
添加⽤于剪切事件的按钮
我们design.ui在 Qt Creator 中打开⽂件并添加两个按钮来触发截图事件。
保存⽂件并重新编译design.ui为design.py:
pyside2-uic design.ui -o design.py
在 中app_advanced.py,两个新按钮现在应该可以识别了。将它们连接到插槽函数:
self.ui.pushButton_area.clicked.connect(self.snipArea)self.ui.pushButton_full.clicked.connect(self.snipFull)
创建⾃定义 Qt ⼩部件
创建⼀个SnippingTool.py⽂件,我们在其中创建⼀个⾃定义 Qt ⼩部件:
import numpy as npimport cv2
from PIL import ImageGrab
from PySide2 import QtWidgets, QtCore, QtGuifrom PySide2.QtCore import Qt
class SnippingWidget(QtWidgets.QWidget): is_snipping = False
def __init__(self, parent=None, app=None): super(SnippingWidget, self).__init__() self.parent = parent
self.setWindowFlags(Qt.WindowStaysOnTopHint)
self.screen = app.primaryScreen()
self.setGeometry(0, 0, self.screen.size().width(), self.screen.size().height()) self.begin = QtCore.QPoint() self.end = QtCore.QPoint()
self.onSnippingCompleted = None
def start(self):
SnippingWidget.is_snipping = True self.setWindowOpacity(0.3)
QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor)) self.show()
⼩部件的⼤⼩应与屏幕分辨率相同,可从primaryScreen()函数中获取。接下来,我们处理⿏标事件:
def mousePressEvent(self, event): self.begin = event.pos() self.end = self.begin self.update()
def mouseMoveEvent(self, event): self.end = event.pos() self.update()
def mouseReleaseEvent(self, event): SnippingWidget.is_snipping = False
QtWidgets.QApplication.restoreOverrideCursor() x1 = min(self.begin.x(), self.end.x()) y1 = min(self.begin.y(), self.end.y()) x2 = max(self.begin.x(), self.end.x()) y2 = max(self.begin.y(), self.end.y()) self.repaint()
QtWidgets.QApplication.processEvents() self.close()
当⿏标移动时,我们画⼀个矩形来表⽰paintEvent()函数中的选定区域:
def paintEvent(self, event):
if SnippingWidget.is_snipping:
brush_color = (128, 128, 255, 100) lw = 3
opacity = 0.3 else:
self.begin = QtCore.QPoint() self.end = QtCore.QPoint() brush_color = (0, 0, 0, 0) lw = 0
opacity = 0
self.setWindowOpacity(opacity) qp = QtGui.QPainter(self)
qp.setPen(QtGui.QPen(QtGui.QColor('black'), lw)) qp.setBrush(QtGui.QColor(*brush_color)) rect = QtCore.QRectF(self.begin, self.end) qp.drawRect(rect)
拍摄屏幕图像
PIL 是⽤于从屏幕捕获图像的 Python 库。松开⿏标后,我们根据矩形的坐标对选中区域进⾏截图。
img = ImageGrab.grab(bbox=(x1, y1, x2, y2))
try:
img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)except:
img = None
拍摄全屏图像很容易:
img = ImageGrab.grab(bbox=(0, 0, self.screen.size().width(), self.screen.size().height()))
隐藏和显⽰应⽤程序窗⼝
⼀旦截图⼩部件准备好,我们就可以在按钮点击事件中调⽤它。注意:为避免遮挡屏幕,应⽤程序窗⼝应在启动截图⼩部件前最⼩化,并在截图完成后恢复:
def onSnippingCompleted(self, frame):
self.setWindowState(Qt.WindowMaximized) if frame is None: return
frame, self._results = self._barcodeManager.decode_frame(frame) self.showResults(frame, self._results)def snipArea(self):
self.setWindowState(Qt.WindowMinimized) self.snippingWidget.start()
def snipFull(self):
self.setWindowState(Qt.WindowMinimized) self.snippingWidget.fullscreen()
测试屏幕⼆维码阅读器
运⾏条码识别程序:
python3 app_advanced.py
在百度搜索⼆维码。
点击Select Area按钮扫描搜索引擎返回的⼆维码(⼀个或多个)。
您还可以⼀键进⾏全屏条码识别。您还可以⼀键进⾏全屏条码识别。
总结
到此这篇关于如何⽤Python从桌⾯读取⼆维码信息的⽂章就介绍到这了,更多相关Python读取⼆维码信息内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务