0

大家好,我正在尝试在 Qt 中旋转图像。在一次又一次地旋转时,图像的大小会减小。我怎样才能停止这种尺寸减少?请帮帮我。我正在使用此代码。

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

2 回答 2

1

我今天早些时候必须解决这个问题。首先,确保您的 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)
于 2017-05-25T02:32:00.740 回答
0

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

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

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

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

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

============== 已编辑 ======================

为了回应旋转变化的评论,您需要确保您有一个从不旋转的源图像,然后对于每次迭代,从源图像创建一个您需要防止图像尺寸和图像质量减小的图像.

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

Image srcImage(":/myimage");

void MyWidget::rotateLabel()
{
    Image img(srcImage);
    img.rotate(rotation);
    label->setPixmap(img);
}
于 2013-05-13T10:35:56.977 回答