屏幕截图程序-透明截图区域

布雷特·拉皮埃尔(Brett Lapierre)

我正在将成功的屏幕截图程序从Tkinter转换为PYQT5。我的问题是如何创建一个完全透明的截图区域(动态更新正方形区域会很好)。正方形的外部将是半透明的。我到处都是堆栈溢出和互联网,找不到这样的例子(其他不是完全透明的绘图窗口)。我已附上我的代码和所要查找的图片示例。“ SnippingWidget”是执行剪裁逻辑的类。

在此处输入图片说明 在此处输入图片说明

import sys

from PyQt5 import QtCore, QtGui
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, QWidget
from PyQt5.QtGui import QIcon, QKeySequence
from PIL import ImageGrab

class App(QMainWindow):
    def __init__(self):
        super().__init__()

        self.initUI()
        self.topMenu()

    def initUI(self):

        self.setWindowTitle('Lil Snippy')
        self.setWindowIcon(QIcon('assets/lilSnippyIcon.png'))
        self.setGeometry(400, 300, 400, 300)
        self.show()

    def topMenu(self):
        menubar = self.menuBar()

        fileMenu = menubar.addMenu('File')
        saveAct = QAction(QIcon('assets/saveIcon.png'), 'Save', self)
        saveAsAct = QAction(QIcon('assets/saveAsIcon.png'), 'Save As', self)


        modeMenu = menubar.addMenu('Mode')
        snipAct = QAction(QIcon('assets/cameraIcon.png'), 'Snip', self)
        snipAct.setShortcut(QKeySequence('F1'))
        snipAct.triggered.connect(self.activateSnipping)
        videoAct = QAction(QIcon('assets/videoIcon.png'), 'Video', self)
        videoAct.setShortcut('F2')
        soundAct = QAction(QIcon('assets/audioIcon.png'), 'Sound', self)
        soundAct.setShortcut('F3')
        autoAct = QAction(QIcon('assets/automationIcon.png'), 'Automation', self)
        autoAct.setShortcut('F4')

        helpMenu = menubar.addMenu('Help')
        helpAct = QAction(QIcon('assets/helpIcon.png'), 'Help', self)
        aboutAct = QAction(QIcon('assets/aboutIcon.png'), 'About', self)

        fileMenu.addAction(saveAct)
        fileMenu.addAction(saveAsAct)
        modeMenu.addAction(snipAct)
        modeMenu.addAction(videoAct)
        modeMenu.addAction(soundAct)
        modeMenu.addAction(autoAct)
        helpMenu.addAction(helpAct)
        helpMenu.addAction(aboutAct)

    def activateSnipping(self):
        print("yes")
        self.Snipper = SnippingWidget()
        application.hide()

class SnippingWidget(QMainWindow):
    def __init__(self, parent = None):
        super(SnippingWidget, self).__init__(parent)
        self.setStyleSheet("background-color: transparent;")
        self.setWindowOpacity(.2)
        self.showFullScreen()

        self.outsideSquareColor = 'red'
        self.squareThickness = 4

        self.startX = None
        self.startY = None
        self.endX = None
        self.endY = None
        self.begin = QtCore.QPoint()
        self.end = QtCore.QPoint()

    def mousePressEvent(self, event):
        self.begin = event.pos()
        self.end = self.begin
        self.startX = event.x()
        self.startY = event.y()
        self.update()

    def mouseReleaseEvent(self, QMouseEvent):
        self.destroy()
        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())
        img = ImageGrab.grab(bbox=(x1, y1, x2, y2))

        img.save('snips/testImage.png')
        application.show()

    def mouseMoveEvent(self, event):
        self.end = event.pos()
        self.update()

    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        qp.setPen(QtGui.QPen(QtGui.QColor('red'), self.squareThickness))
        trans = QtGui.QColor(255,255,255,255)
        qp.setBrush(trans)
        rect = QtCore.QRectF(self.begin, self.end)
        qp.drawRect(rect)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    application = App()
    sys.exit(app.exec_())
永乐

您必须使用QPainterPath从带有选定矩形的窗口中减去矩形的方法:

import sys

from PyQt5 import QtCore, QtGui, QtWidgets

from PIL import ImageGrab


class App(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.initUI()
        self.topMenu()

    def initUI(self):
        self.setWindowTitle("Lil Snippy")
        self.setWindowIcon(QtGui.QIcon("assets/lilSnippyIcon.png"))
        self.setGeometry(400, 300, 400, 300)

    def topMenu(self):
        menubar = self.menuBar()

        fileMenu = menubar.addMenu("File")
        saveAct = QtWidgets.QAction(QtGui.QIcon("assets/saveIcon.png"), "Save", self)
        saveAsAct = QtWidgets.QAction(
            QtGui.QIcon("assets/saveAsIcon.png"), "Save As", self
        )

        modeMenu = menubar.addMenu("Mode")
        snipAct = QtWidgets.QAction(QtGui.QIcon("assets/cameraIcon.png"), "Snip", self)
        snipAct.setShortcut(QtGui.QKeySequence("F1"))
        snipAct.triggered.connect(self.activateSnipping)
        videoAct = QtWidgets.QAction(QtGui.QIcon("assets/videoIcon.png"), "Video", self)
        videoAct.setShortcut("F2")
        soundAct = QtWidgets.QAction(QtGui.QIcon("assets/audioIcon.png"), "Sound", self)
        soundAct.setShortcut("F3")
        autoAct = QtWidgets.QAction(
            QtGui.QIcon("assets/automationIcon.png"), "Automation", self
        )
        autoAct.setShortcut("F4")

        helpMenu = menubar.addMenu("Help")
        helpAct = QtWidgets.QAction(QtGui.QIcon("assets/helpIcon.png"), "Help", self)
        aboutAct = QtWidgets.QAction(QtGui.QIcon("assets/aboutIcon.png"), "About", self)

        fileMenu.addAction(saveAct)
        fileMenu.addAction(saveAsAct)
        modeMenu.addAction(snipAct)
        modeMenu.addAction(videoAct)
        modeMenu.addAction(soundAct)
        modeMenu.addAction(autoAct)
        helpMenu.addAction(helpAct)
        helpMenu.addAction(aboutAct)

        self.snipper = SnippingWidget()
        self.snipper.closed.connect(self.on_closed)

    def activateSnipping(self):
        self.snipper.showFullScreen()
        self.hide()

    def on_closed(self):
        self.snipper.hide()
        self.show()


class SnippingWidget(QtWidgets.QMainWindow):
    closed = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(SnippingWidget, self).__init__(parent)
        self.setStyleSheet("background-color: transparent;")
        self.setWindowOpacity(0.2)

        self.outsideSquareColor = "red"
        self.squareThickness = 4

        self.start_point = QtCore.QPoint()
        self.end_point = QtCore.QPoint()

    def mousePressEvent(self, event):
        self.start_point = event.pos()
        self.end_point = event.pos()
        self.update()

    def mouseMoveEvent(self, event):
        self.end_point = event.pos()
        self.update()

    def mouseReleaseEvent(self, QMouseEvent):
        r = QtCore.QRect(self.start_point, self.end_point).normalized()
        img = ImageGrab.grab(bbox=r.getCoords())
        img.save("snips/testImage.png")
        self.closed.emit()

    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        qp.setPen(
            QtGui.QPen(QtGui.QColor(self.outsideSquareColor), self.squareThickness)
        )
        trans = QtGui.QColor(255, 255, 255, 255)
        qp.setBrush(trans)

        outer = QtGui.QPainterPath()
        outer.addRect(QtCore.QRectF(self.rect()))

        inner = QtGui.QPainterPath()
        inner.addRect(QtCore.QRectF(self.start_point, self.end_point).normalized())
        r = outer - inner
        qp.drawPath(r)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    application = App()
    application.show()
    sys.exit(app.exec_())

更新:

class SnippingWidget(QtWidgets.QMainWindow):
    closed = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(SnippingWidget, self).__init__(parent)
        self.setAttribute(QtCore.Qt.WA_NoSystemBackground, True)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)
        self.setStyleSheet("background:transparent;")
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

        self.outsideSquareColor = "red"
        self.squareThickness = 4

        self.start_point = QtCore.QPoint()
        self.end_point = QtCore.QPoint()

    def mousePressEvent(self, event):
        self.start_point = event.pos()
        self.end_point = event.pos()
        self.update()

    def mouseMoveEvent(self, event):
        self.end_point = event.pos()
        self.update()

    def mouseReleaseEvent(self, QMouseEvent):
        r = QtCore.QRect(self.start_point, self.end_point).normalized()
        img = ImageGrab.grab(bbox=r.getCoords())
        img.save("snips/testImage.png")
        self.closed.emit()

    def paintEvent(self, event):
        trans = QtGui.QColor(255, 255, 255)
        r = QtCore.QRectF(self.start_point, self.end_point).normalized()

        qp = QtGui.QPainter(self)
        trans.setAlphaF(0.2)
        qp.setBrush(trans)
        outer = QtGui.QPainterPath()
        outer.addRect(QtCore.QRectF(self.rect()))
        inner = QtGui.QPainterPath()
        inner.addRect(r)
        r_path = outer - inner
        qp.drawPath(r_path)

        qp.setPen(
            QtGui.QPen(QtGui.QColor(self.outsideSquareColor), self.squareThickness)
        )
        trans.setAlphaF(0)
        qp.setBrush(trans)
        qp.drawRect(r)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

拍摄特定区域的屏幕截图

来自分类Dev

拍摄模拟区域的屏幕截图

来自分类Dev

屏幕截图的特定区域仅屏幕截图的左上方?

来自分类Dev

截取特定应用程序的屏幕截图

来自分类Dev

开发chrome扩展程序的屏幕截图

来自分类Dev

Qt屏幕截图共享应用程序-如何选择屏幕区域

来自分类Dev

如何创建特定区域的屏幕截图?

来自分类Dev

从Qt的选定区域(QRubberBand)截取屏幕截图

来自分类Dev

paraview python屏幕截图中的黑暗区域

来自分类Dev

如何创建特定区域的屏幕截图?

来自分类Dev

在区域截图捕获之前冻结屏幕

来自分类Dev

GNOME 屏幕截图区域选择导致冻结

来自分类Dev

Selenium [Python]中的PhantomJS的透明屏幕截图?

来自分类Dev

在全屏应用程序中防止屏幕截图(打印屏幕)

来自分类Dev

使用C#在Windows应用程序中以pdf格式获取选定区域的屏幕截图

来自分类Dev

Android屏幕截图和屏幕截图权限

来自分类Dev

如何通过在桌面上绘制屏幕截图来选择屏幕截图区域?

来自分类Dev

C#拍摄WPF应用程序的屏幕截图

来自分类Dev

如何使用QTP拍摄应用程序的屏幕截图?

来自分类Dev

Android拍摄我的应用程序活动的屏幕截图

来自分类Dev

如何制作Tkinter应用程序的屏幕截图?

来自分类Dev

从全屏Qt快速应用程序中截取屏幕截图

来自分类Dev

拍摄Mac上特定应用程序窗口的屏幕截图

来自分类Dev

屏幕截图何时用于应用程序抽屉?

来自分类Dev

屏幕截图非活动的外部应用程序

来自分类Dev

通过shell脚本捕获终端应用程序的屏幕截图?

来自分类Dev

从全屏Qt快速应用程序中截取屏幕截图

来自分类Dev

拍摄Mac上特定应用程序窗口的屏幕截图

来自分类Dev

WinJS以编程方式获取应用程序的屏幕截图

Related 相关文章

  1. 1

    拍摄特定区域的屏幕截图

  2. 2

    拍摄模拟区域的屏幕截图

  3. 3

    屏幕截图的特定区域仅屏幕截图的左上方?

  4. 4

    截取特定应用程序的屏幕截图

  5. 5

    开发chrome扩展程序的屏幕截图

  6. 6

    Qt屏幕截图共享应用程序-如何选择屏幕区域

  7. 7

    如何创建特定区域的屏幕截图?

  8. 8

    从Qt的选定区域(QRubberBand)截取屏幕截图

  9. 9

    paraview python屏幕截图中的黑暗区域

  10. 10

    如何创建特定区域的屏幕截图?

  11. 11

    在区域截图捕获之前冻结屏幕

  12. 12

    GNOME 屏幕截图区域选择导致冻结

  13. 13

    Selenium [Python]中的PhantomJS的透明屏幕截图?

  14. 14

    在全屏应用程序中防止屏幕截图(打印屏幕)

  15. 15

    使用C#在Windows应用程序中以pdf格式获取选定区域的屏幕截图

  16. 16

    Android屏幕截图和屏幕截图权限

  17. 17

    如何通过在桌面上绘制屏幕截图来选择屏幕截图区域?

  18. 18

    C#拍摄WPF应用程序的屏幕截图

  19. 19

    如何使用QTP拍摄应用程序的屏幕截图?

  20. 20

    Android拍摄我的应用程序活动的屏幕截图

  21. 21

    如何制作Tkinter应用程序的屏幕截图?

  22. 22

    从全屏Qt快速应用程序中截取屏幕截图

  23. 23

    拍摄Mac上特定应用程序窗口的屏幕截图

  24. 24

    屏幕截图何时用于应用程序抽屉?

  25. 25

    屏幕截图非活动的外部应用程序

  26. 26

    通过shell脚本捕获终端应用程序的屏幕截图?

  27. 27

    从全屏Qt快速应用程序中截取屏幕截图

  28. 28

    拍摄Mac上特定应用程序窗口的屏幕截图

  29. 29

    WinJS以编程方式获取应用程序的屏幕截图

热门标签

归档