首页 > 解决方案 > 如何将编辑后的 ​​QGraphicsScene 保存为图像文件

问题描述

QGraphicsPixmapItem从加载的图像(6000x4000 像素)中添加到QGraphicsScene. 我添加了几个实心正方形并addRect在场景中使用。

如何将编辑后的高分辨率图像保存为全尺寸图像

这是我的代码

class PhotoViewer(QGraphicsView):
    def __init__(self, parent):
        self._zoom = 0
        self._items = []
        self._scene = QGraphicsScene(self)
        self._photo = QGraphicsPixmapItem()
        self._scene.addItem(self._photo)
        self.setScene(self._scene)
        self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
        self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setBackgroundBrush(QBrush(QColor(30, 30, 30)))
        self.setFrameShape(QFrame.NoFrame)
        # some other actions

    def fitInView(self, scale=True):
        rect = QRectF(self._photo.pixmap().rect())
        if not rect.isNull():
            self.setSceneRect(rect)
        # custom fit in view and scaling

    def setPhoto(self, pixmap=None):
        self._zoom = 0
        if pixmap and not pixmap.isNull():
            self._empty = False
            self._photo.setPixmap(pixmap)
        self.fitInView()

    def add_a_Rectangle(self):
        self._added = self._scene.addRect(rect,pen)
        # custom other code

    def save_image(self):
        #====method that I need to implement=======#
        pass

class MainWindow(QMainWindow):
    def __init__(self):
        self.viewer_edit = PhotoViewer(self)
    def save_img(self):
        self.viewer_edit.save_img()
        pass

我尝试了两种方法,但它不起作用
首先

img = QPixmap(self._scene.grab())
painter = QPainter(img)
painter.setRenderHint(QPainter.Antialiasing)
self._scene.render(painter)
painter.end()
img.save('D:\\test.png')

结果

加载图像的大小为 3000x3000 像素,但结果图像的大小为 1881x768 像素。

第二

我曾经参考How to render a part of QGraphicsScene and save It as image file PyQt5 and eyllanesc's comment。

w = self._photo.boundingRect().width()
h = self._photo.boundingRect().height()
image = QImage(int(w),int(h), QImage.Format_ARGB32_Premultiplied)
painter = QPainter(image)
self._scene.render(painter,QRectF(0, 0,w,h), self._photo.boundingRect())
painter.end()
image.save('D:\\test2.png',quality=100)

最后我解决了问题

标签: pythonpyqtpyqt5qgraphicsviewqgraphicsscene

解决方案


推荐阅读