在 PySide6 中用鼠标在 QGraphicsItem 上绘画

问题描述 投票:0回答:1

我正在尝试创建一个用于分割的注释工具。我的想法是创建 QGrahicsView 和 QGraphicsScene,然后将图像和遮罩添加到场景中。到目前为止,我能够将蒙版覆盖在图像上,但尚未弄清楚如何在蒙版上绘画。

我的测试代码:

additem

我想要实现的目标的示例:

没有任何油漆的图像。

用鼠标手动给小狗上色。

这就是导出的蒙版的样子。导出的格式应为*.png。

python-3.x qgraphicsview qgraphicsscene pyside6
1个回答
0
投票

相反,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
仅在可见的绘制区域内,所以我们需要确保 bothmouseMoveEvent()
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)


© www.soinside.com 2019 - 2024. All rights reserved.