在pyqt4中旋转像素图会产生不需要的翻译

时间:2015-08-08 11:21:21

标签: pyqt4

我正在尝试编写一个简单的应用程序,在按下按钮时旋转png图像。我把它全部工作得很好,除了当图像旋转时它偏离它在东南方向的中心。我原本以为它不是围绕它的中心旋转,而是每45度旋转一次返回原点,这很奇怪。

关键事件我只是打电话:

pixmap = pixmap.transformed(QtGui.QTransform().rotate(-self.rot), QtCore.Qt.SmoothTransformation)

有没有办法设置转换的原点以阻止图像移动?

1 个答案:

答案 0 :(得分:3)

如果您使用QLabel绘制QPixmap,一个简单的解决方案是将QLabel的对齐方式设置为AlignCenter。此外,为了避免在图像旋转的前45度期间初始调整QLabel的大小,可以将QLabel的最小尺寸设置为像素图的对角线的值。然后,图像应该在其中心周围正确旋转,而不会有任何不必要的来回平移。

下面我将演示如何在一个简单的应用程序中完成此操作:

import sys
from PyQt4 import QtGui, QtCore
import urllib

class myApplication(QtGui.QWidget):
    def __init__(self, parent=None):
        super(myApplication, self).__init__(parent)

        #---- Prepare a Pixmap ----

        url = ('http://sstatic.net/stackexchange/img/logos/' +
               'careers/careers-icon.png?v=0288ba302bf6')
        self.img = QtGui.QImage()
        self.img.loadFromData(urllib.urlopen(url).read())

        pixmap = QtGui.QPixmap(self.img)

        #---- Embed Pixmap in a QLabel ----

        diag = (pixmap.width()**2 + pixmap.height()**2)**0.5

        self.label = QtGui.QLabel()
        self.label.setMinimumSize(diag, diag)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setPixmap(pixmap)

        #---- Prepare a Layout ----

        grid = QtGui.QGridLayout()

        button = QtGui.QPushButton('Rotate 15 degrees')
        button.clicked.connect(self.rotate_pixmap)

        grid.addWidget(self.label, 0, 0)
        grid.addWidget(button, 1, 0)

        self.setLayout(grid)

        self.rotation = 0

    def rotate_pixmap(self):

        #---- rotate ----

        # Rotate from initial image to avoid cumulative deformation from
        # transformation

        pixmap = QtGui.QPixmap(self.img)
        self.rotation += 15

        transform = QtGui.QTransform().rotate(self.rotation)
        pixmap = pixmap.transformed(transform, QtCore.Qt.SmoothTransformation)

        #---- update label ----

        self.label.setPixmap(pixmap)

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)

    instance = myApplication()  
    instance.show()    

    sys.exit(app.exec_())

结果是:

enter image description here

或者,如果您使用QPixmap直接绘制QPainter,此帖子can't get the image to rotate in center in Qt似乎可以解决您的问题。