kaien_Q 2023-07-27 10:14 采纳率: 25%
浏览 19

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_()


  • 写回答

2条回答 默认 最新

  • 九分热度一滴汗水 2023-07-27 17:21
    关注

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

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

    以下是修改后的代码:

    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' 替换为你想要展示的图片的实际路径。

    评论

报告相同问题?

问题事件

  • 修改了问题 7月27日
  • 创建了问题 7月27日

悬赏问题

  • ¥15 报酬10000,做一个简单的换汇网站
  • ¥15 关于#vue.js#的问题:word excel和ppt预览问题语言-javascript)
  • ¥15 Apache显示系统错误3该如何解决?
  • ¥30 uniapp小程序苹果手机加载gif图片不显示动效?
  • ¥20 js怎么实现跨域问题
  • ¥15 C++dll二次开发,C#调用
  • ¥15 请教,如何使用C#加载本地摄像头进行逐帧推流
  • ¥15 Python easyocr无法顺利执行,如何解决?
  • ¥15 为什么会突然npm err!啊
  • ¥15 java服务连接es读取列表数据,服务连接本地es获取数据时的速度很快,但是换成远端的es就会非常慢,这是为什么呢