猿问

使用 QPainter 用 alpha 值覆盖两个像素图

我正在尝试覆盖 2 个像素图并将它们转换为 QGraphics 场景中的单个像素图。两个像素图在某些位置都是透明的。我想使用此处列出的“SourceOver”混合类型组合贴图:我在下面有一个简单的玩具示例来说明我创建了两个虚拟透明像素图,一个绿色和一个蓝色的问题。实际上,这些地图是从图像加载并绘制的,但是这个例子重现了这个问题。基于此如何在另一个图像的顶部添加图像?,我尝试的方法(注释掉 4 行)是用其中一个像素图创建一个 QPainter,然后在它上面绘制另一个像素图,但是这会导致程序崩溃。关于如何解决这个问题的任何想法?我最终希望能够保存组合的像素图。


import sys

from PyQt5 import QtCore, QtGui, QtWidgets

from PyQt5.QtGui import QPixmap, QPainter, QPen, QBrush, QPainterPath

from PyQt5.QtCore import (QLineF, QPointF, QRectF, Qt)


class Viewer(QtWidgets.QGraphicsView):

    def __init__(self, parent):

        super(Viewer, self).__init__(parent)

        self._scene = QtWidgets.QGraphicsScene(self)

        self.photo = QtWidgets.QGraphicsPixmapItem()

        self.label = QtWidgets.QGraphicsPixmapItem()

        self._scene.addItem(self.photo)

        self._scene.addItem(self.label)

        self.setScene(self._scene)        


    def overlayMaps(self):

        blue = QtGui.QPixmap(600, 600) 

        blue.fill(QtGui.QColor(0,0,255,0))

        p = QPainter(blue)

        self.pen = QPen()

        self.pen.setColor(QtGui.QColor(0,0,255,255))

        self.pen.setWidth(10)

        p.setPen(self.pen)

        p.drawLine(0,0,600,600)



        green = QtGui.QPixmap(600, 600)

        green.fill(QtGui.QColor(0,255,0,0))            

        p = QPainter(green)

        self.pen = QPen()

        self.pen.setColor(QtGui.QColor(0,255,0,255))

        self.pen.setWidth(10)

        p.setPen(self.pen)

        p.drawLine(600,0,0,600)


        self.photo.setPixmap(blue)

        self.label.setPixmap(green) 


        resultPixmap = QtGui.QPixmap(self.photo.pixmap().width(), self.photo.pixmap().height())

#        resultPainter = QtGui.QPainter(resultPixmap)

#        resultPainter.setCompositionMode(QtGui.QPainter.CompositionMode_SourceOver)

#        resultPainter.drawPixmap(300,300, self.photo.pixmap()) 

#        resultPainter.drawPixmap(300,300, self.label.pixmap()) 


慕婉清6462132
浏览 451回答 1
1回答

慕村9548890

我已经实现了一个根据模式执行加入动作的功能,为了更好地欣赏我已经移动了项目。import sysfrom PyQt5 import QtCore, QtGui, QtWidgetsdef join_pixmap(p1, p2, mode=QtGui.QPainter.CompositionMode_SourceOver):    s = p1.size().expandedTo(p2.size())    result =  QtGui.QPixmap(s)    result.fill(QtCore.Qt.transparent)    painter = QtGui.QPainter(result)    painter.setRenderHint(QtGui.QPainter.Antialiasing)    painter.drawPixmap(QtCore.QPoint(), p1)    painter.setCompositionMode(mode)    painter.drawPixmap(result.rect(), p2, p2.rect())    painter.end()    return resultclass Viewer(QtWidgets.QGraphicsView):    def __init__(self, parent=None):        super(Viewer, self).__init__(parent)        self._scene = QtWidgets.QGraphicsScene(self)        self.setScene(self._scene)          blue = QtGui.QPixmap(100, 100)         blue.fill(QtCore.Qt.transparent)        p = QtGui.QPainter(blue)        pen = QtGui.QPen(QtGui.QBrush(QtGui.QColor(0,0,255)), 10)        p.setPen(pen)        p.drawLine(0, 0, 100, 100)        p.end()        self.photo = self._scene.addPixmap(blue)        green = QtGui.QPixmap(100, 100)        green.fill(QtCore.Qt.transparent)                    p = QtGui.QPainter(green)        pen = QtGui.QPen(QtGui.QBrush(QtGui.QColor(0, 255, 0, 255)), 10)        p.setPen(pen)        p.drawLine(100, 0, 0, 100)        p.end()        self.label = self._scene.addPixmap(green)         self.label.setPos(200, 0)             self.overlayMaps()    def overlayMaps(self):        p1 = QtGui.QPixmap(self.photo.pixmap())        p2 = QtGui.QPixmap(self.label.pixmap())        result_pixmap = join_pixmap(self.photo.pixmap(), self.label.pixmap())        self.result_item = self._scene.addPixmap(result_pixmap)        self.result_item.setPos(100, 200)        result_pixmap.save("result_pixmap.png")if __name__ == '__main__':    import sys    app = QtWidgets.QApplication(sys.argv)    window = Viewer()    window.resize(640, 480)    window.show()    sys.exit(app.exec_())result_pixmap.png
随时随地看视频慕课网APP

相关分类

Python
我要回答