欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何用Python從桌面讀取二維碼信息詳解

 更新時(shí)間:2021年10月13日 11:00:50   作者:初遇我ㄖ寸の熱情呢?  
二維碼作為一種信息傳遞的工具,在當(dāng)今社會(huì)發(fā)揮了重要作用,下面這篇文章主要給大家介紹了關(guān)于如何用Python從桌面讀取二維碼信息的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

日常生活中,我們通常會(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)的三種遍歷方式解析

    今天小編就為大家分享一篇對(duì)python For 循環(huán)的三種遍歷方式解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • matplotlib如何設(shè)置坐標(biāo)軸刻度的個(gè)數(shù)及標(biāo)簽的方法總結(jié)

    matplotlib如何設(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-06
  • python實(shí)現(xiàn)三次密碼驗(yàn)證的示例

    python實(shí)現(xiàn)三次密碼驗(yàn)證的示例

    這篇文章主要介紹了python實(shí)現(xiàn)三次密碼驗(yàn)證的示例,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • Python aiohttp百萬(wàn)并發(fā)極限測(cè)試實(shí)例分析

    Python 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-10
  • SpringBoot中的@MessageMapping注解詳解

    SpringBoot中的@MessageMapping注解詳解

    這篇文章主要介紹了SpringBoot中的@MessageMapping注解詳解,Spring Boot 提供了對(duì) WebSocket 的支持,其中 @MessageMapping 注解是一個(gè)常用的注解,它可以將一個(gè) Java 方法標(biāo)記為 WebSocket 的消息處理器,需要的朋友可以參考下
    2023-08-08
  • pandas中DataFrame重置索引的幾種方法

    pandas中DataFrame重置索引的幾種方法

    在pandas中,經(jīng)常對(duì)數(shù)據(jù)進(jìn)行處理 而導(dǎo)致數(shù)據(jù)索引順序混亂,從而影響數(shù)據(jù)讀取、插入等,所以小編總結(jié)了幾種索引重置的方法,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Python基礎(chǔ)之條件控制操作示例【if語(yǔ)句】

    Python基礎(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

    基于Python在MacOS上安裝robotframework-ride

    今天小編就為大家分享一篇關(guān)于基于Python在MacOS上安裝robotframework-ride,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • anaconda安裝pytorch1.7.1和torchvision0.8.2的方法(親測(cè)可用)

    anaconda安裝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
  • Python繪制KS曲線的實(shí)現(xiàn)方法

    Python繪制KS曲線的實(shí)現(xiàn)方法

    本篇文章主要介紹了Python繪制KS曲線的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08

最新評(píng)論