如何用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í),我們畫一個(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)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對(duì)python For 循環(huán)的三種遍歷方式解析
今天小編就為大家分享一篇對(duì)python For 循環(huán)的三種遍歷方式解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02matplotlib如何設(shè)置坐標(biāo)軸刻度的個(gè)數(shù)及標(biāo)簽的方法總結(jié)
這里介紹兩種設(shè)置坐標(biāo)軸刻度的方法,一種是利用pyplot提交的api去進(jìn)行設(shè)置,另一種是通過(guò)調(diào)用面向?qū)ο蟮腶pi, 即通過(guò)matplotlib.axes.Axes去設(shè)置,需要的朋友可以參考下2021-06-06python實(shí)現(xiàn)三次密碼驗(yàn)證的示例
這篇文章主要介紹了python實(shí)現(xiàn)三次密碼驗(yàn)證的示例,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04Python aiohttp百萬(wàn)并發(fā)極限測(cè)試實(shí)例分析
這篇文章主要介紹了Python aiohttp百萬(wàn)并發(fā)極限測(cè)試,結(jié)合實(shí)例形式分析了Python異步編程基于aiohttp客戶端高并發(fā)請(qǐng)求的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-10-10SpringBoot中的@MessageMapping注解詳解
這篇文章主要介紹了SpringBoot中的@MessageMapping注解詳解,Spring Boot 提供了對(duì) WebSocket 的支持,其中 @MessageMapping 注解是一個(gè)常用的注解,它可以將一個(gè) Java 方法標(biāo)記為 WebSocket 的消息處理器,需要的朋友可以參考下2023-08-08Python基礎(chǔ)之條件控制操作示例【if語(yǔ)句】
這篇文章主要介紹了Python基礎(chǔ)之條件控制操作,結(jié)合實(shí)例形式分析了Python使用if語(yǔ)句進(jìn)行條件控制的相關(guān)操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-03-03基于Python在MacOS上安裝robotframework-ride
今天小編就為大家分享一篇關(guān)于基于Python在MacOS上安裝robotframework-ride,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12anaconda安裝pytorch1.7.1和torchvision0.8.2的方法(親測(cè)可用)
這篇文章主要介紹了anaconda安裝pytorch1.7.1和torchvision0.8.2的方法(親測(cè)可用),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02