我正在尝试创建一个用于分割的注释工具。我的想法是创建 QGrahicsView 和 QGraphicsScene,然后将图像和遮罩添加到场景中。到目前为止,我能够将蒙版覆盖在图像上,但尚未弄清楚如何在蒙版上绘画。
我的测试代码:additem
我想要实现的目标的示例:
没有任何油漆的图像。
相反,QGraphicsPathItem子类可能是首选,因为它提供了一些好处,也可以在某种程度上提高性能。最重要的是,它支持 QRegion,这是基于像素的区域,更简单,更适合图像编辑。
一个简单的实现需要在该项目中实现
from PySide6.QtWidgets import (
QWidget,
QMainWindow,
QApplication,
QFileDialog,
QStyle,
QColorDialog,
QGraphicsView,
QGraphicsScene,
QGraphicsPixmapItem,
)
from PySide6.QtCore import Qt, Slot, QStandardPaths, QObject
from PySide6.QtGui import (
QMouseEvent,
QPaintEvent,
QPen,
QAction,
QPainter,
QColor,
QPixmap,
QIcon,
QKeySequence,
)
from PySide6.QtUiTools import QUiLoader
import sys
loader = QUiLoader() #set up loader object
image_path =r"image.jpg"
mask_path=r"mask.png"
class UserInterface(QObject): #An object wrapping around our ui
def __init__(self):
super().__init__()
self.ui = loader.load("paint3.ui", None)
self.ui.setWindowTitle("Painter3")
self.ui.button1.clicked.connect(self.do_something)
self.mask_opcity = 0.8
def show(self):
self.ui.show()
def do_something(self):
scene = QGraphicsScene(self)
image = QPixmap(image_path)
img_item = QGraphicsPixmapItem(image)
scene.addItem(img_item)
mask = QPixmap(mask_path)
msk_item = QGraphicsPixmapItem(mask)
msk_item.setOpacity(self.mask_opcity)
scene.addItem(msk_item)
self.ui.grapView.setScene(scene)
if __name__ == "__main__":
app = QApplication(sys.argv)
w = UserInterface()
w.show()
sys.exit(app.exec())
和
mousePressEvent()
处理程序,但这还需要考虑另一个重要方面:像大多数基于形状的项目一样,它的 boundaries仅在可见的绘制区域内,所以我们需要确保 both 的
mouseMoveEvent()
和 boundingRect()
函数返回代表掩码的完整矩形,即使它是空的。然后,子类将根据要使用鼠标绘制的实际区域创建一个 QPainterPath。为了实现这一点,我们从一个空的 shape()
开始,并使用它的函数向其中添加(或删除)新区域;然后,每次更新整体区域时,我们都会创建一个新的 QPainterPath,添加整体区域,并在项目上调用
QRegion()
。通过使用 QRegion 的运算符和辅助函数,我们可以轻松添加新区域:setPath()
运算符将原始区域与新区域合并
,而
|
函数则相反。
为了设置现有的遮罩,我们可以用 QPixmap 函数生成的新区域替换当前区域:
subtracted
要获得遮罩,我们只需根据当前大小创建一个新的QPixmap,
清除它(重要!),为其创建一个QPainter,将当前区域设置为
剪辑区域并用颜色(将被剪辑到蒙版)。 这是一个基本实现,还允许使用 Ctrl
修饰符“擦除”当前掩码。
pixmap = QPixmap('mask.png')
mask = pixmap.createHeuristicMask()
# alternatively, createMaskFromColor(<some QColor>)
path = QPainterPath()
path.addRegion(QRegion(mask))
self.setPath(path)