PyQt5 旋转像素图

Posted

技术标签:

【中文标题】PyQt5 旋转像素图【英文标题】:PyQt5 rotation pixmap 【发布时间】:2022-01-21 04:17:24 【问题描述】:

在 Pyqt5 中,我想旋转一个像素图,但每次我尝试它都会改变大小。 我的代码是:

import math
import sys

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLabel
from PyQt5.QtCore import QObject, QPointF, Qt, QRectF,QRect
from PyQt5.QtGui import QPixmap, QTransform, QPainter

class Window(QWidget):
    def __init__(self, *args, **kwargs):
        super(Window, self).__init__()

        self.arch1 = QPixmap("arch1.png")
        pm = QPixmap(556,556)
        rectF = QRectF(0,0,556,556)

        painter = QPainter(pm)
        painter.drawPixmap(rectF, self.arch1, rectF)
        painter.end()

        self.label = QLabel("AAAAAAAAAA")
        self.label.setPixmap(pm)
        butA = QPushButton("A")
        butA.clicked.connect(lambda: self.rotate_item())

        layout = QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(butA)
        self.setLayout(layout)
        self.show()

    def rotate_item(self):
        rectF = QRectF(0,0,556,556)
        self.arch1 = self.arch1.transformed(QTransform().rotate(36))
        pix = QPixmap(556,556)
        painter = QPainter(pix)
        painter.drawPixmap(rectF, self.arch1,QRectF(self.arch1.rect()))
        painter.end()
        self.label.setPixmap(pix)

def main():
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

if __name__=="__main__":
    main()

我只想旋转而不是调整大小。你建议我怎么做? 我有四个其他文件,我想以不同的方式旋转。我发布了一些照片以了解我想要做什么。

还有其他方法吗?

圈一个

圈二

完整的圆圈

【问题讨论】:

请在编辑帖子时更加小心,因为您最近的修改使其完全无法阅读,所以我不得不将其回滚。在提交之前还要检查帖子的预览,并阅读更多关于formatting code的信息。 【参考方案1】:

问题是旋转后的像素图有一个更大的边界矩形。

考虑以下示例:

浅蓝色方块显示旋转图像的实际边界矩形,更大。

使用drawPixmap(rectF, self.arch1, QRectF(self.arch1.rect())) 将导致画家在矩形rectF 中绘制像素图,使用 边界矩形作为源,因此它变得“更小”。

您应该旋转画家,而不是旋转图像。由于转换默认使用painter的原点(0, 0),我们需要先平移到矩形的中心,旋转painter,然后再平移回原点。

请注意,在以下示例中,我也总是图像开始绘制,而不修改它:连续应用转换将导致由于锯齿而导致的绘图伪影,并且经过一些轮换后,质量会受到很大影响。rotation 变量用于跟踪当前的旋转。

class Window(QWidget):
    def __init__(self, *args, **kwargs):
        # ...
        self.rotation = 0

    def rotate_item(self):
        self.rotation = (self.rotation + 36) % 360
        rectF = QRectF(0,0,556,556)
        pix = QPixmap(556,556)
        painter = QPainter(pix)
        painter.translate(rectF.center())
        painter.rotate(self.rotation)
        painter.translate(-rectF.center())
        painter.drawPixmap(0, 0, self.arch1)
        painter.end()
        self.label.setPixmap(pix)

【讨论】:

以上是关于PyQt5 旋转像素图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyQt5 中反转旋转框选择?

在 python 中使用 pyqt5 旋转或调整轴刻度的大小

PyQt5 - 在表格小部件的列中创建一个检查项,即使行数与旋转框不同

如何在不使用paintEvent的情况下旋转PyQt5 QPushButton?

关于图像旋转以及旋转后对应像素的位置

相机像素旋转