QT中用QImage读取图片后,减小软件的内存问题(同时发现用QFileDialog打开关闭对话框会引起内存不断增加)

QT版本:Qt 5.5.1 (MSVC 2013, 32 bit)
Qt Creator版本:Qt Creator 3.5.1 (opensource)
系统:win10

编写了一个小功能:用户点击一个按钮——弹出QFileDialog对话框——用户选择n张图片并点击确定后——程序将图片存放至一个QImage类型的QList中——在界面上用label显示用户选中的第一张图

QList<QImage>   m_qlistLoadImgs;
void DebugWindow::open()
{
    QFileDialog *fileDlg = new QFileDialog(this);
    fileDlg->setWindowTitle("Choose Pictures");
    QStringList qstrFilters;
    qstrFilters<<"Image files(*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm)";
    qstrFilters<<"Any files (*)";
    fileDlg->setNameFilters(qstrFilters);//设置文件过滤器
    fileDlg->setFileMode(QFileDialog::ExistingFiles);//设置能选择多个文件,如果是单个文件就写成QFileDialog::ExistingFile
    if(fileDlg->exec() == QDialog::Accepted)
    {
        QStringList strPathList = fileDlg->selectedFiles();
        if(!m_qlistLoadImgs.empty())
        {
            m_qlistLoadImgs.clear();
        }
        QPixmap pixmapTemp;
        for(int i = 0;i<strPathList.count();i++)//
        {
            pixmapTemp.load(strPathList[i]);
            m_qlistLoadImgs.push_back(pixmapTemp.toImage());
        }
        if(!m_qlistLoadImgs[0].isNull())
        {
            QPixmap crtPixmap = QPixmap::fromImage(m_qlistLoadImgs.at(0));
            int with = ui->label_pic->width();
            int height = ui->label_pic->height();
            crtPixmap= crtPixmap.scaled(with, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);  // 饱满填充
            ui->label_pic->setPixmap(crtPixmap);
        }
    }
    else
    {
        QMessageBox mesg;
        mesg.warning(this,"警告","打开图片失败!");
    }
    fileDlg->close();
    delete fileDlg;
    fileDlg = NULL;
}

程序运行后,发现我导入一张536KB的jpg图片,从资源管理器中查看软件内存会增加接近10M。
后来研究了一下QImage,发现用QImage存放的图片一个像素占用4个字节,而我之前导入的jpg图片分辨率为19201200,因此存放到QImage中之后占用字节数为1920120*4=9216000字节这个和通过QImage.byteCount()获取到的字节数相同)=8.799M。
但8.799M<10M,另外的2.2M被谁吃了?
后来我发现每次打开QFileDialog,即使什么都不操作,直接关闭,软件占用内存都会增加100KB左右,但每次增加的具体数值不一样,即使我在关闭对话框后加上
fileDlg->close();
delete fileDlg;
fileDlg = NULL;
也没改善占用内存增加的问题。
我一共用如下3中方法打开文件:
方法一:

QStringList strPathList =QFileDialog::getOpenFileNames(this,tr("Open image file"),"",tr("Image files(*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm);;""Any files (*)"));

 
  • 1

方法二:

    QFileDialog *fileDlg = new QFileDialog(this);
    fileDlg->setWindowTitle("Choose Pictures");
    QStringList qstrFilters;
    qstrFilters<<"Image files(*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm)";
    qstrFilters<<"Any files (*)";
    fileDlg->setNameFilters(qstrFilters);//设置文件过滤器
    fileDlg->setFileMode(QFileDialog::ExistingFiles);//设置能选择多个文件,如果是单个文件就写成QFileDialog::ExistingFile
    if(fileDlg->exec() == QDialog::Accepted)
    {
        QStringList strPathList = fileDlg->selectedFiles();
     }
    fileDlg->close();
    delete fileDlg;
    fileDlg = NULL;

方法三:
将QFileDialog *fileDlg = new QFileDialog(this);改为QFileDialog filedlg(this);
后续代码通方法二

通过上述三种方式来打开关闭对话框,发现内存都会不断增加,至此我没找到合适的解决方法,如果有哪位大神能给予解答,鄙人不甚感激!

©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页