У меня есть работающее приложение для рисования для некоторой сегментации изображений.Для этого у меня есть два слоя: исходное изображение и слой изображения, на котором я рисую.
Теперь я хочу реализовать метод стирания.Я реализовал функцию отмены, но я также хотел бы, чтобы пользователь мог выбирать «цвет» кисти, чтобы иметь возможность стирать определенные части, например ластик в краске.Я думал, что это будет возможно при рисовании цветом с непрозрачностью, но это просто приводит к тому, что линия не рисуется.
Поэтому для меня цель состоит в том, чтобы нарисовать линию, которая удаляет значения пикселей в слое изображения, так что я могу видеть базовое изображение
MVP рисунка
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()
Как стереть подмножество пикселей?
Как в этом примере, какой цвет должен быть заданself.brushColor
в функции changeColour
?
Информация
Белый цвет не является решением, потому что в действительности изображение внизу является сложным изображением, поэтому я хочу сделать верхний слой "прозрачным" снова при стирании.