在旋转图像时,图像尺寸减小

时间:2013-05-13 05:21:35

标签: image qt qpixmap

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

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

2 个答案:

答案 0 :(得分:0)

在QPixmap :: transformed的Qt帮助文件中,它指出: -

  

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

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

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

或者,如果你总是旋转90度,你可以旋转外部艺术程序中的图像,加载所有4个图像,只需设置你想要的图像,而不是通过Qt旋转它们。

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

为了响应不同旋转的注释,您需要确保您拥有一个永不旋转的源图像,然后在每次迭代时,从源图像创建一个图像,以防止图像尺寸减小和图像质量。

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

Image srcImage(":/myimage");

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

答案 1 :(得分:0)

我今天早些时候必须解决这个问题。首先,确保您的QLabel小部件没有将scaledContents标志设置为True;第二,当你以45度旋转时,你的图像需要缩放以适应QLabel的边界;基本上,您需要将其缩放到维度/ 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)