<bdo id='IbkAm'></bdo><ul id='IbkAm'></ul>

<small id='IbkAm'></small><noframes id='IbkAm'>

  1. <tfoot id='IbkAm'></tfoot>

    <legend id='IbkAm'><style id='IbkAm'><dir id='IbkAm'><q id='IbkAm'></q></dir></style></legend>
  2. <i id='IbkAm'><tr id='IbkAm'><dt id='IbkAm'><q id='IbkAm'><span id='IbkAm'><b id='IbkAm'><form id='IbkAm'><ins id='IbkAm'></ins><ul id='IbkAm'></ul><sub id='IbkAm'></sub></form><legend id='IbkAm'></legend><bdo id='IbkAm'><pre id='IbkAm'><center id='IbkAm'></center></pre></bdo></b><th id='IbkAm'></th></span></q></dt></tr></i><div id='IbkAm'><tfoot id='IbkAm'></tfoot><dl id='IbkAm'><fieldset id='IbkAm'></fieldset></dl></div>
    1. 在画布上擦笔

      时间:2023-08-07

      <legend id='ng7m1'><style id='ng7m1'><dir id='ng7m1'><q id='ng7m1'></q></dir></style></legend>

        <tbody id='ng7m1'></tbody>
        <i id='ng7m1'><tr id='ng7m1'><dt id='ng7m1'><q id='ng7m1'><span id='ng7m1'><b id='ng7m1'><form id='ng7m1'><ins id='ng7m1'></ins><ul id='ng7m1'></ul><sub id='ng7m1'></sub></form><legend id='ng7m1'></legend><bdo id='ng7m1'><pre id='ng7m1'><center id='ng7m1'></center></pre></bdo></b><th id='ng7m1'></th></span></q></dt></tr></i><div id='ng7m1'><tfoot id='ng7m1'></tfoot><dl id='ng7m1'><fieldset id='ng7m1'></fieldset></dl></div>
          <bdo id='ng7m1'></bdo><ul id='ng7m1'></ul>
            • <tfoot id='ng7m1'></tfoot>

              <small id='ng7m1'></small><noframes id='ng7m1'>

              1. 本文介绍了在画布上擦笔的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                问题描述

                我有一个功能正常的绘图应用程序,用于对图像进行一些分割.为此,我有两层,原始图像和我正在绘制的图像层.

                I have a functioning drawing application for some segmentation on images. For this I have two layers, the original image and the image layer I am drawing on.

                我现在想实现一种擦除方法.我已经实现了撤消功能,但我也希望用户能够选择画笔颜色"以便能够擦除特定部分,例如油漆中的橡皮擦.我认为这可以通过使用不透明的颜色进行绘制来实现,但这只会导致不绘制线条.

                I now want to implement a method for erasing. I have implemented undo functionality, but I would also like the user to be able to select a brush "color" as to be able to erase specific parts, like the eraser in paint. I thought this would be possible by drawing with a color with opacity, but that just results in no line being drawn.

                因此,我的目标是画一条线,去除图像层中的像素值,以便我可以看到底层图像

                The goal for me is therefore to draw a line, that removes the pixel values in the image layer, such that I can see the underlying image

                from PyQt5.QtWidgets import QApplication, QMainWindow, QMenuBar, QMenu, QAction
                from PyQt5.QtGui import QIcon, QImage, QPainter, QPen
                from PyQt5.QtCore import Qt, QPoint
                from PyQt5.QtGui import QColor
                import sys
                
                class Window(QMainWindow):
                    def __init__(self):
                        super().__init__()
                
                        top = 400
                        left = 400
                        width = 800
                        height = 600
                
                        self.setWindowTitle("MyPainter")
                        self.setGeometry(top, left, width, height)
                
                        self.image = QImage(self.size(), QImage.Format_ARGB32)
                        self.image.fill(Qt.white)
                        self.imageDraw = QImage(self.size(), QImage.Format_ARGB32)
                        self.imageDraw.fill(Qt.transparent)
                
                        self.drawing = False
                        self.brushSize = 2
                        self.brushColor = Qt.black
                        self.lastPoint = QPoint()
                
                        self.change = False
                        mainMenu = self.menuBar()
                        changeColour = mainMenu.addMenu("changeColour")
                        changeColourAction = QAction("change",self)
                        changeColour.addAction(changeColourAction)
                        changeColourAction.triggered.connect(self.changeColour)
                
                    def mousePressEvent(self, event):
                        if event.button() == Qt.LeftButton:
                            self.drawing = True
                            self.lastPoint = event.pos()
                
                    def mouseMoveEvent(self, event):
                        if event.buttons() and Qt.LeftButton and self.drawing:
                            painter = QPainter(self.imageDraw)
                            painter.setPen(QPen(self.brushColor, self.brushSize,     Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
                            painter.drawLine(self.lastPoint, event.pos())
                            self.lastPoint = event.pos()
                            self.update()
                
                    def mouseReleaseEvent(self, event):
                        if event.button == Qt.LeftButton:
                            self.drawing = False
                
                    def paintEvent(self, event):
                        canvasPainter = QPainter(self)
                        canvasPainter.drawImage(self.rect(), self.image, self.image.rect())
                        canvasPainter.drawImage(self.rect(), self.imageDraw, self.imageDraw.rect())
                
                    def changeColour(self):
                        if not self.change:
                            # erase
                            self.brushColor = QColor(255,255,255,0)
                        else:
                            self.brushColor = Qt.black
                        self.change = not self.change
                
                if __name__ == "__main__":
                    app = QApplication(sys.argv)
                    window = Window()
                    window.show()
                    app.exec()
                

                如何擦除像素子集?

                在这个例子中,应该为 changeColour 函数中的 self.brushColor 赋予什么颜色?

                How to erase a subset of pixels?

                As in this example what color should be given to self.brushColor in the changeColour function?

                白色不是解决方案,因为实际上底部的图像是一个复杂的图像,因此我想在擦除时再次使顶层透视".

                The colour white is not the solution, because in reality the image at the bottom is a complex image, I therefore want to make the toplayer "see-through" again, when erasing.

                推荐答案

                你必须改变 compositionMode 到 QPainter::CompositionMode_Clear 并用 eraseRect().

                You have to change the compositionMode to QPainter::CompositionMode_Clear and erase with eraseRect().

                from PyQt5 import QtCore, QtGui, QtWidgets
                
                class Window(QtWidgets.QMainWindow):
                    def __init__(self):
                        super().__init__()
                        top, left, width, height = 400, 400, 800, 600
                        self.setWindowTitle("MyPainter")
                        self.setGeometry(top, left, width, height)
                
                        self.image = QtGui.QImage(self.size(), QtGui.QImage.Format_ARGB32)
                        self.image.fill(QtCore.Qt.white)
                        self.imageDraw = QtGui.QImage(self.size(), QtGui.QImage.Format_ARGB32)
                        self.imageDraw.fill(QtCore.Qt.transparent)
                
                        self.drawing = False
                        self.brushSize = 2
                        self._clear_size = 20
                        self.brushColor = QtGui.QColor(QtCore.Qt.black)
                        self.lastPoint = QtCore.QPoint()
                
                        self.change = False
                        mainMenu = self.menuBar()
                        changeColour = mainMenu.addMenu("changeColour")
                        changeColourAction = QtWidgets.QAction("change", self)
                        changeColour.addAction(changeColourAction)
                        changeColourAction.triggered.connect(self.changeColour)
                
                    def mousePressEvent(self, event):
                        if event.button() == QtCore.Qt.LeftButton:
                            self.drawing = True
                            self.lastPoint = event.pos()
                
                    def mouseMoveEvent(self, event):
                        if event.buttons() and QtCore.Qt.LeftButton and self.drawing:
                            painter = QtGui.QPainter(self.imageDraw)
                            painter.setPen(QtGui.QPen(self.brushColor, self.brushSize, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))
                            if self.change:
                                r = QtCore.QRect(QtCore.QPoint(), self._clear_size*QtCore.QSize())
                                r.moveCenter(event.pos())
                                painter.save()
                                painter.setCompositionMode(QtGui.QPainter.CompositionMode_Clear)
                                painter.eraseRect(r)
                                painter.restore()
                            else:
                                painter.drawLine(self.lastPoint, event.pos())
                            painter.end()
                            self.lastPoint = event.pos()
                            self.update()
                
                    def mouseReleaseEvent(self, event):
                        if event.button == QtCore.Qt.LeftButton:
                            self.drawing = False
                
                    def paintEvent(self, event):
                        canvasPainter = QtGui.QPainter(self)
                        canvasPainter.drawImage(self.rect(), self.image, self.image.rect())
                        canvasPainter.drawImage(self.rect(), self.imageDraw, self.imageDraw.rect())
                
                    def changeColour(self):
                        self.change = not self.change
                        if self.change:
                            pixmap = QtGui.QPixmap(QtCore.QSize(1, 1)*self._clear_size)
                            pixmap.fill(QtCore.Qt.transparent)
                            painter = QtGui.QPainter(pixmap)
                            painter.setPen(QtGui.QPen(QtCore.Qt.black, 2))
                            painter.drawRect(pixmap.rect())
                            painter.end()
                            cursor = QtGui.QCursor(pixmap)
                            QtWidgets.QApplication.setOverrideCursor(cursor)
                        else:
                            QtWidgets.QApplication.restoreOverrideCursor()
                
                if __name__ == "__main__":
                    import sys
                    app = QtWidgets.QApplication(sys.argv)
                    window = Window()
                    window.show()
                    sys.exit(app.exec())
                

                这篇关于在画布上擦笔的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                上一篇:即使小部件关闭,如何在 PyQt 中的 QLineEdits 中保 下一篇:如何在python中将文件保存为excel时显示进度条?

                相关文章

                最新文章

              2. <tfoot id='2M1Pu'></tfoot>
                <i id='2M1Pu'><tr id='2M1Pu'><dt id='2M1Pu'><q id='2M1Pu'><span id='2M1Pu'><b id='2M1Pu'><form id='2M1Pu'><ins id='2M1Pu'></ins><ul id='2M1Pu'></ul><sub id='2M1Pu'></sub></form><legend id='2M1Pu'></legend><bdo id='2M1Pu'><pre id='2M1Pu'><center id='2M1Pu'></center></pre></bdo></b><th id='2M1Pu'></th></span></q></dt></tr></i><div id='2M1Pu'><tfoot id='2M1Pu'></tfoot><dl id='2M1Pu'><fieldset id='2M1Pu'></fieldset></dl></div>
                1. <small id='2M1Pu'></small><noframes id='2M1Pu'>

                  • <bdo id='2M1Pu'></bdo><ul id='2M1Pu'></ul>
                  <legend id='2M1Pu'><style id='2M1Pu'><dir id='2M1Pu'><q id='2M1Pu'></q></dir></style></legend>