为什么当我使用QImage :: scaled()时我的内存开销很大?

时间:2016-01-22 11:29:26

标签: qt

我为教育目的编写简单的图像查看器。并且应用程序必须能够缩放图像。为此,我使用QImage :: scaled()

void ScreenImage::zoomImage(const qreal zoomFactor)
{
    const qint32 src_width = m_Image.width();
    const qint32 src_height = m_Image.height();

    QImage img = m_Image.scaled(QSize(src_width, src_height) * zoomFactor,
                            Qt::IgnoreAspectRatio,Qt::FastTransformation);
    showImage(img);
}

之后,我在QLabel上传了收到的图像并在屏幕上显示。

void ScreenImage::showImage(const QImage &img)
{
    _pLabel->setPixmap(QPixmap::fromImage(img));
    if(_pScrollArea->isHidden())
        _pScrollArea->show();
}

问题:为什么我在使用QImage :: scaled()时会占用大量内存?我怎么解决它?

我录制了video来查看此问题。

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

您应该更改实施缩放的方式。 因为你真的这样做(通过缩放原始图像),你的缩放图像非常大并且消耗大量内存(每个像素至少4个字节)。

另外请注意,您只显示其中的一小部分,因此图像占用的大部分内存都是未使用的'。

您需要做的不是缩放整个图像,而只缩放将向用户显示的部分。

我没有现成的解决方案,但您可以尝试使用自定义绘图来自定义绘图,这些绘图只会显示图像的所需部分。

<强>更新

我想到了一些额外的提示: 您可以准备自定义QWidget,将其大小设置为缩放图片的大小,并放入QScrollArea

然后在paintEvent上,您可以使用QPaintEvent中的数据来确定绘制(可见)小部件的区域。这将让您计算应提取和缩放原始图像的哪个部分以匹配窗口小部件的可见区域。这个技巧将导致您将始终使用相同数量的内存,而这仅取决于窗口的大小。