2016-01-22 49 views
2

我爲教育目的編寫簡單的圖像查看器。而且應用程序必須能夠縮放圖像。爲此我使用QImage :: scaled()爲什麼當我使用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查看此問題。

感謝您的回答。

回答

0

您應該改變實施縮放的方式。 因爲你真的這麼做了(通過縮放原始圖像),縮放後的圖像非常大,並佔用大量內存(每個像素至少4個字節)。

另外請注意,你只顯示它的一小部分,所以圖像佔用的大部分內存是'未使用'。

您需要做的不是縮放整個圖像,而只是將要顯示給用戶的部分。

我還沒有準備好解決方案,但是您可以使用自定義繪畫進行自定義小部件的實驗,該自定義繪畫僅顯示圖像的所需部分。

UPDATE:

剛剛來到我的腦海一些額外的提示: 你可以準備定製QWidget這將它的大小設置爲縮放圖像的大小,放入到QScrollArea

然後在paintEvent上,您可以使用來自QPaintEvent的數據來確定繪製的部件區域(可見)。這會讓你計算出原始圖像的哪一部分應該被提取和縮放以匹配小部件的可見區域。這個技巧會導致你將總是使用相同數量的內存,這將僅取決於你的窗口的大小。

+1

非常感謝您的回答。感謝您的想法,我已經看到了QImage :: setDevicePixelRatio(),這些都是我需要的。現在內存不消耗浪費。 –

相關問題