改变 Qpixmap 的大小

Changing the size of a Qpixmap

如何更改 Qpixmap 的 size/shape 以接收这样的结果?

原创

结果

QTransform can create basic shape transformations, which can then be applied to QPixmap.transformed().

这个具体案例使用“透视”变换,它使用投影和缩放信息,并且它是使用 QTransform.quadToQuad() 实现的。请注意,QTransform 也提供 squareToQuad(),但它有时不可靠。

重要的是创建两个 QPolygonF 实例,第一个基于图像的矩形,第二个基于“投影”点的角。

请注意,从矩形创建 QPolygonF 会产生具有 5 个点的多边形,最后一个点是第一个点,以便使其“闭合”。 QTransform quadToQuad 相反,需要 4 个点,因此您必须删除最后一个点。另请注意,角 必须 顺序相同,因此它们将是:左上角、右上角、右下角、左下角。

在下面的示例中,透视将右上角移动到高度的 20%,将右下角移动到相同的相对点(高度 - 高度的 80%)。

class ProjectionTest(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        layout = QtWidgets.QVBoxLayout(self)
        source = QtGui.QPixmap('square.jpg')
        layout.addWidget(QtWidgets.QLabel(pixmap=source))

        # the original rectangle of the image, as a QRectF (floating point)
        rect = QtCore.QRectF(source.rect())
        # the source polygon, ignoring the last point
        square = QtGui.QPolygonF(rect)[:4]
        # the "projected" square
        cone = QtGui.QPolygonF([
            rect.topLeft(), 
            QtCore.QPointF(rect.right(), rect.height() * .2), 
            QtCore.QPointF(rect.right(), rect.height() * .8), 
            rect.bottomLeft(), 
        ])
        transform = QtGui.QTransform()
        if QtGui.QTransform.quadToQuad(square, cone, transform):
            new = source.transformed(transform, QtCore.Qt.SmoothTransformation)
            layout.addWidget(QtWidgets.QLabel(pixmap=new))

这是最终结果: