如何用Python從桌面讀取二維碼信息詳解
日常生活中,我們通常會(huì)拿出智能手機(jī)掃描二維碼。但是當(dāng)我們?cè)陔娔X上工作時(shí),手機(jī)可能不是掃描網(wǎng)頁(yè)上出現(xiàn)的二維碼的最佳選擇。
- 原因一:從顯示器屏幕上拍攝的照片具有干擾 QR 碼識(shí)別的莫爾圖案。
- 原因二:你可能希望直接在 PC 上使用解碼后的信息,例如用于打開(kāi)網(wǎng)站的 URL。
本文將使用 Python 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的工具,以方便在桌面屏幕上識(shí)別二維碼。
安裝
所需的 Python 包包括PIL、OpenCV、Dynamsoft Barcode Reader和Qt。
python3 -m pip install pillow opencv-python dbr pyside2
條碼 SDK
需要解鎖Dynamsoft Barcode SDK 的功能,您可以申請(qǐng)30 天免費(fèi)試用許可。
從屏幕掃描二維碼
由于我已經(jīng)使用 Qt for Python、OpenCV 和 Dynamsoft Barcode Reader實(shí)現(xiàn)了一個(gè)GUI 條形碼閱讀器,剩下的就是添加屏幕截圖功能。實(shí)現(xiàn)截圖功能的步驟:
- 創(chuàng)建一個(gè)自定義 Qt 小部件并將其放在屏幕頂部。
- paintEvent()在移動(dòng)鼠標(biāo)的同時(shí)繪制所選區(qū)域的功能。
- 釋放鼠標(biāo)后,調(diào)用PIL.ImageGrab.grab()以獲取所選區(qū)域的圖像。
添加用于剪切事件的按鈕
我們design.ui在 Qt Creator 中打開(kāi)文件并添加兩個(gè)按鈕來(lái)觸發(fā)截圖事件。

保存文件并重新編譯design.ui為design.py:
pyside2-uic design.ui -o design.py
在 中app_advanced.py,兩個(gè)新按鈕現(xiàn)在應(yīng)該可以識(shí)別了。將它們連接到插槽函數(shù):
self.ui.pushButton_area.clicked.connect(self.snipArea) self.ui.pushButton_full.clicked.connect(self.snipFull)
創(chuàng)建自定義 Qt 小部件
創(chuàng)建一個(gè)SnippingTool.py文件,我們?cè)谄渲袆?chuàng)建一個(gè)自定義 Qt 小部件:
import numpy as np import cv2 from PIL import ImageGrab from PySide2 import QtWidgets, QtCore, QtGui from 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()
小部件的大小應(yīng)與屏幕分辨率相同,可從primaryScreen()函數(shù)中獲取。
接下來(lái),我們處理鼠標(biāo)事件:
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()
當(dāng)鼠標(biāo)移動(dòng)時(shí),我們畫(huà)一個(gè)矩形來(lái)表示paintEvent()函數(shù)中的選定區(qū)域:
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 庫(kù)。松開(kāi)鼠標(biāo)后,我們根據(jù)矩形的坐標(biāo)對(duì)選中區(qū)域進(jìn)行截圖。
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()))
隱藏和顯示應(yīng)用程序窗口
一旦截圖小部件準(zhǔn)備好,我們就可以在按鈕點(diǎn)擊事件中調(diào)用它。注意:為避免遮擋屏幕,應(yīng)用程序窗口應(yīng)在啟動(dòng)截圖小部件前最小化,并在截圖完成后恢復(fù):
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()
測(cè)試屏幕二維碼閱讀器
運(yùn)行條碼識(shí)別程序:
python3 app_advanced.py
在百度搜索二維碼。
點(diǎn)擊Select Area按鈕掃描搜索引擎返回的二維碼(一個(gè)或多個(gè))。

您還可以一鍵進(jìn)行全屏條碼識(shí)別。您還可以一鍵進(jìn)行全屏條碼識(shí)別。
總結(jié)
到此這篇關(guān)于如何用Python從桌面讀取二維碼信息的文章就介紹到這了,更多相關(guān)Python讀取二維碼信息內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信