Qt图像类QImage,QPixmap,QImageReader加载时间对比

我们都知道Qt使用QImage和QPixmap及QImageReader加载图片然后显示在QLabel上,一般的图片显示并没有什么区别,但是大图显示就有区别了,下面可以看下对比:

首先根据官方的说法

QPixmap是专门为绘图而生,当需要绘制图片时你需要使用QPixmap。QImage则是为I/O,为图片像素访问以及修改而设计的。如果你想访问图片的像素或是修改图片像素,则需要使用QImage,或者借助于QPainter来操作像素。另外跟QImage不同是,QPixmap跟硬件是 相关的,如X11, Mac 以及 Symbian平台上,QPixmap 是存储在服务器端,而QImage则是存储在客户端,在Windows平台上,QPixmap和QImage都是存储在客户端,并不使用任何的GDI资 源。所以在X11, Mac 以及 Symbian平台上,QImage: 因为它是存储在客户端,往QImage上绘图比较快,但显示它则比较慢。QPixmap: 因为它是存储在服务器端,往QPixmap上绘图比较慢,但显示它则比较快。但在Windows平台上则是是一样的,因为它们都存储在客户端。

使用的图片为15.7M的大图, Win平台

方法1:

void MainWindow::slotShowBigImage()
{
    QString strPath = QString("E:/example/qt/QtBigImageShow/image/image15m.jpg");
    qDebug() << "MainWindow::slotShowBigImage==start=========" << QDateTime::currentDateTime().toString("hh:mm:ss.zzz");

    //方法1:
    QPixmap pixmap(strPath);

    ui->label_image->setPixmap(pixmap);
    qDebug() << "MainWindow::slotShowBigImage==end===========" << QDateTime::currentDateTime().toString("hh:mm:ss.zzz");
}

运行结果:

MainWindow::slotShowBigImage==start========== "19:48:17.153"

MainWindow::slotShowBigImage==end========== "19:48:18.876"

没有裁剪,内存占用比较大。

方法2:

void MainWindow::slotShowBigImage()
{
    QString strPath = QString("E:/example/qt/QtBigImageShow/image/image15m.jpg");
    qDebug() << "MainWindow::slotShowBigImage==start=========" << QDateTime::currentDateTime().toString("hh:mm:ss.zzz");

    //方法2:
    QImage image(strPath);
    QPixmap pixmap = QPixmap::fromImage(image);
    pixmap = pixmap.scaledToWidth(450); //不缩小内存占用很大

    ui->label_image->setPixmap(pixmap);
    qDebug() << "MainWindow::slotShowBigImage==end===========" << QDateTime::currentDateTime().toString("hh:mm:ss.zzz");
}

MainWindow::slotShowBigImage==start=========== "19:52:25.080"

MainWindow::slotShowBigImage==end=========== "19:52:26.809"

进行裁剪,内存明显示小了非常多

方法3:

void MainWindow::slotShowBigImage()
{
    QString strPath = QString("E:/example/qt/QtBigImageShow/image/image15m.jpg");
    qDebug() << "MainWindow::slotShowBigImage==start=========" << QDateTime::currentDateTime().toString("hh:mm:ss.zzz");

    //方法3:
    QImage image(strPath);
    image = image.scaledToWidth(450);
    QPixmap pixmap = QPixmap::fromImage(image);

    ui->label_image->setPixmap(pixmap);
    qDebug() << "MainWindow::slotShowBigImage==end===========" << QDateTime::currentDateTime().toString("hh:mm:ss.zzz");
}

MainWindow::slotShowBigImage==start=========== "19:55:17.350"

MainWindow::slotShowBigImage==end=========== "19:55:19.122"

方法4:
void MainWindow::slotShowBigImage()
{
    QString strPath = QString("E:/example/qt/QtBigImageShow/image/image15m.jpg");
    qDebug() << "MainWindow::slotShowBigImage==start=========" << QDateTime::currentDateTime().toString("hh:mm:ss.zzz");

    //方法4:
    QImage image;
    std::unique_ptr<QImageReader> imgRead(new QImageReader(strPath));
    if(imgRead->canRead())
    {
        image = imgRead->read();
    }
    QPixmap pixmap = QPixmap::fromImage(image);
    pixmap = pixmap.scaledToWidth(450); //不缩小内存占用很大

    ui->label_image->setPixmap(pixmap);
    qDebug() << "MainWindow::slotShowBigImage==end===========" << QDateTime::currentDateTime().toString("hh:mm:ss.zzz");
}

MainWindow::slotShowBigImage==start=========== "19:57:41.277"

MainWindow::slotShowBigImage==end=========== "19:57:43.006"

方法5:

void MainWindow::slotShowBigImage()
{
    QString strPath = QString("E:/example/qt/QtBigImageShow/image/image15m.jpg");
    qDebug() << "MainWindow::slotShowBigImage==start=========" << QDateTime::currentDateTime().toString("hh:mm:ss.zzz");

    //方法5:
    QMimeDatabase db;
    //判断文件类型
    QMimeType mime = db.mimeTypeForFile(strPath, QMimeDatabase::MatchMode::MatchContent);
    std::string strSuffix = mime.preferredSuffix().toStdString();
    QImage image;
    std::unique_ptr<QImageReader> imgRead(new QImageReader(strPath, strSuffix.c_str()));

    if(!imgRead->canRead()) //第一次失败了,再重新加载一次
    {
        imgRead->device()->seek(0);
        imgRead->setFileName(strPath);
        imgRead->setDecideFormatFromContent(true);
    }

    if(imgRead->canRead())
    {
        qint64 nSize = imgRead->device()->size();
        int nWidth = imgRead->size().width();
        int nHeight = imgRead->size().height();

        imgRead->setScaledSize(QSize(450, 500)); //这一步缩小速度比用pixmap缩放快很多
    }
    image = imgRead->read();
    QPixmap pixmap = QPixmap::fromImage(image);

    ui->label_image->setPixmap(pixmap);
    qDebug() << "MainWindow::slotShowBigImage==end===========" << QDateTime::currentDateTime().toString("hh:mm:ss.zzz");
}

MainWindow::slotShowBigImage==start=========== "20:00:57.196"

MainWindow::slotShowBigImage==end=========== "20:00:57.608"

 由以上可以看出方法5明显示比其它几种方法快很多。



 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值