pyqt旋转图片问题

pyqt5如何在label显示图片并旋转图片
旋转要基于图片的某个点旋转,不能变形。但是这个旋转不是我想要的,而且使用transform.translate(0, 100)平移没有效果,没查找到原因,求解答
使用以下代码,发现图片不是基于平面上旋转(轴不是我想的Z轴)

from PyQt5.QtWidgets import QApplication, QLabel, QWidget
from PyQt5.QtGui import QPixmap, QTransform
from PyQt5.QtCore import Qt

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.setGeometry(100, 100, 400, 300)

        # 加载图片
        pixmap = QPixmap('XX.png')

        # 创建标签并设置图片
        label = QLabel(self)
        label.setPixmap(pixmap)
        label.setGeometry(50, 50, pixmap.width(), pixmap.height())

        # 旋转图片
        transform = QTransform().rotate(50)
        #平移失效
        transform.translate(0, 100)
        rotated_pixmap = pixmap.transformed(transform, Qt.SmoothTransformation)

        # 创建标签并设置旋转后的图片
        rotated_label = QLabel(self)
        rotated_label.setPixmap(rotated_pixmap)
        rotated_label.setGeometry(50, 50, rotated_pixmap.width(), rotated_pixmap.height())

if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()


你的代码中存在一些问题,需要进行一些修改。你的代码中,先执行了旋转再执行了平移,这就导致平移操作实际上是以旋转后的坐标系统为基础进行的。你需要先执行平移再执行旋转,这样旋转操作就是以平移后的坐标系统为基础进行的。

还需要注意的是,平移和旋转都是相对于图片的原点(左上角)进行的,所以如果你想以图片的中心进行旋转,你需要先把图片的中心平移到原点,然后进行旋转,最后再把原点平移到图片的中心。

以下是修改后的代码:

from PyQt5.QtWidgets import QApplication, QLabel, QWidget
from PyQt5.QtGui import QPixmap, QTransform
from PyQt5.QtCore import Qt


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.setGeometry(100, 100, 400, 300)

        # 加载图片
        pixmap = QPixmap('XX.png')

        # 创建标签并设置图片
        label = QLabel(self)
        label.setPixmap(pixmap)
        label.setGeometry(50, 50, pixmap.width(), pixmap.height())

        # 平移图片中心到原点
        transform = QTransform().translate(-pixmap.width() / 2, -pixmap.height() / 2)
        # 旋转图片
        transform.rotate(50)
        # 平移原点回图片中心
        transform.translate(pixmap.width() / 2, pixmap.height() / 2)
        
        rotated_pixmap = pixmap.transformed(transform, Qt.SmoothTransformation)

        # 创建标签并设置旋转后的图片
        rotated_label = QLabel(self)
        rotated_label.setPixmap(rotated_pixmap)
        rotated_label.setGeometry(50, 50, rotated_pixmap.width(), rotated_pixmap.height())


if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

这样的处理应该可以解决你的问题。注意把 'XX.png' 替换为你想要展示的图片的实际路径。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 文章:pyqt5使用label显示图片 中也许有你想要的答案,请看下吧
  • 除此之外, 这篇博客: pyqt5 的label设置图片自适应中的 知识点 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    提问: 我想在使用PyQt5的label中显示图片,并且能够旋转图片。在上述代码中我发现,图片并不是围绕我期望的Z轴旋转的。您能否帮助我解决这个问题,并提供一个优化后的代码片段来实现这个功能?

    代码片段:

    from PyQt5.QtWidgets import QApplication, QLabel, QWidget
    from PyQt5.QtGui import QPixmap, QTransform
    from PyQt5.QtCore import Qt
    
    class MainWindow(QWidget):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            self.setGeometry(100, 100, 400, 300)
    
            # 加载图片
            pixmap = QPixmap('XX.png')
    
            # 创建标签并设置图片
            label = QLabel(self)
            label.setPixmap(pixmap)
            label.setGeometry(50, 50, pixmap.width(), pixmap.height())
    
            # 旋转图片
            transform = QTransform()
            transform.rotate(50)
            rotated_pixmap = pixmap.transformed(transform, Qt.SmoothTransformation)
    
            # 创建标签并设置旋转后的图片
            rotated_label = QLabel(self)
            rotated_label.setPixmap(rotated_pixmap)
            rotated_label.setGeometry(50, 50, rotated_pixmap.width(), rotated_pixmap.height())
    
    if __name__ == '__main__':
        app = QApplication([])
        window = MainWindow()
        window.show()
        app.exec_()
    

    优化提示: 为了解决您的问题,您需要将旋转点设置为图像的中心点而不是默认的(0, 0)点。您可以使用QTransform.translate()方法来平移图像,将旋转点放置在图像的中心点。以下是优化后的代码片段:

    # 旋转图片
    transform = QTransform()
    transform.translate(pixmap.width() / 2, pixmap.height() / 2)  # 平移旋转中心到图像中心
    transform.rotate(50)
    rotated_pixmap = pixmap.transformed(transform, Qt.SmoothTransformation)
    

    这段代码将旋转中心平移到图像的中心点,然后对图像进行旋转。现在,旋转应该基于图像的中心点进行,并且不会发生变形。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^