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中显示图片,并且能够旋转图片。在上述代码中我发现,图片并不是围绕我期望的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)
这段代码将旋转中心平移到图像的中心点,然后对图像进行旋转。现在,旋转应该基于图像的中心点进行,并且不会发生变形。