2013-05-13 60 views
0

大家好, 我想旋转Qt中的图像。在反复旋转时,图像的大小会减小。我怎样才能阻止这个尺寸的减少?请帮助我。我正在使用此代码。虽然旋转的图像,图像的大小减少

void MyWidget::rotateLabel() 
{ 
    QPixmap pixmap(*my_label->pixmap()); 
    QMatrix rm; 
    rm.rotate(90); 
    pixmap = pixmap.transformed(rm); 
    my_label->setPixmap(pixmap); 
} 

回答

0

在为QPixmap的Qt的帮助文件::转变,它规定: -

变换变换内部调整,以补偿 不需要翻译;即产生的像素映像是包含原始像素映像的所有变换点的最小像素映像 。使用 trueMatrix()函数检索用于变换像素图的 的实际矩阵。

我假设图像的宽度和高度不相等。因此,正如您所观察到的,每次旋转都会减小尺寸,以确保保持完整的图像。

通过添加边框将原始图像更改为具有相同的宽度和高度,或者在旋转之前或之后缩放图像,但图像质量会受到影响。

或者,如果您始终旋转90度,则可以在外部艺术计划中旋转图像,加载所有4张图像并设置您想要的图像,而不是通过Qt旋转它们。

============== EDITED ======================

在回应的评论有不同的旋转,你需要确保你有一个永远不会旋转的源图像,然后对于每次迭代,从源图像创建一个图像,以防止图像大小和图像质量的降低。

在伪代码,这将是这样的: -

Image srcImage(":/myimage"); 

void MyWidget::rotateLabel() 
{ 
    Image img(srcImage); 
    img.rotate(rotation); 
    label->setPixmap(img); 
} 
+0

为您的帮助需要帮助Merlin,我已经尝试过在旋转后调整图像的大小,但图像的大小仍然减小。请告诉我其他人或其他能够帮助我的人。 – Ashish 2013-06-20 06:10:12

+0

你总是在旋转90度吗? – TheDarkKnight 2013-06-20 07:36:07

+0

没有Merlin,它不总是90度,可能是25,35,37,128,230意味着它不是一个固定值。 – Ashish 2013-06-26 05:28:27

0

我不得不在今天早些时候来解决这个问题。首先,确保您的QLabel小部件没有将scaledContents标志设置为True;第二,当旋转45度时,图像需要缩放以适应QLabel的边界;基本上,您需要将其缩放到dimension/sqrt(2)。然后,只有这样,你能转换图像吗?

我正在使用PyQt,但同样的原则适用。

label = my_QLabel_instance 
    angle = my_arbitrary_angle 
    image = some_stored_reference_to_original_QImage_instance 
    dimension = dimension/sqrt(2) 

    transform = QtGui.QTransform().rotate(angle) 
    pixmap = QtGui.QPixmap(image) 
    pixmap = pixmap.scaled(dimension, dimension) 
    pixmap = pixmap.transformed(transform, QtCore.Qt.SmoothTransformation) 

    label.setPixmap(pixmap)