Qt实用技巧:测试QImage加载解码、QImage使用原数据、QImage格式转换等等的时间消耗

60 篇文章 55 订阅
45 篇文章 13 订阅

若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/79562841
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究

目录

需求

Demo

ReadMe

测试耗时项

加载图片的信息(可使用Demo替换自己的图片尝试即可)

演示图

核心代码


Qt开发专栏:实用技巧(点击传送门)

 

    Qt实用技巧:测试QImage加载解码、QImage使用原数据、QImage格式转换等等的时间消耗

 

需求

        测试Qt软解码时间,测试QImage数据类型转换的时间,确定项目方案。

 

Demo

        下载地址:https://download.csdn.net/download/qq21497936/10287385

      

ReadMe

 

测试耗时项

        1.从文件读取二进制转为image再到pixmap的时间

        2.image加载文件转换成pixmap的时间

        3.image加载文件只记录转换成pixmap的时间

        4.rgb数据赋值给image转换成pixmap的时间

        5.rgb数据赋值给image只记录转换成pixmap的时间

 

加载图片的信息(可使用Demo替换自己的图片尝试即可)

5*1920*1080p(较大)

 

演示图

 

核心代码

特别注意:用QFile读取文件耗时1ms不到,已测试过

1.从文件读取二进制转为image再到pixmap的时间

total = 0;
    for(int index = 0; index < _dirs; index++)
    {
        for(int index2 = 0; index2 < _count; index2++)
        {
            QElapsedTimer t;
            t.start();
            QString file = QString("./images/images%1/%2.jpg").arg(index+1).arg(index2+1);
            DEBUG(file);
            // 测试证明,读取文件根本花不了几个ms
            QFile f(file);
            f.open(QIODevice::ReadOnly);
            QByteArray data = f.readAll();
            // 使用QFile读取二进制,转换成image后再转换成pixmap
            QImage image;
            image.loadFromData(data);//转换成QImage
            QPixmap bmp;
            bmp = QPixmap::fromImage(image);//转换成QPixmap
            QString str = QString("file: %1 size:%2 time:%3").arg(file).arg(f.size()).arg(t.elapsed());
            total += t.elapsed();
            DEBUG(str);
            ui->textBrowser->append(str);
            f.close();
        }
    }
    ui->textBrowser->append(QString("total time : %1").arg(total));

2.image加载文件转换成pixmap的时间

total = 0;
    for(int index = 0; index < _dirs; index++)
    {
        for(int index2 = 0; index2 < _count; index2++)
        {
            QElapsedTimer t;
            QString file = QString("./images/images%1/%2.jpg").arg(index+1).arg(index2+1);
            t.start();
            // 使用QImage直接加载文件,再转换成pixmap
            DEBUG(file);
            QImage image;//转换成QImage
            image.load(file);
            QPixmap bmp;
            bmp = QPixmap::fromImage(image);//转换成QPixmap
            QString str = QString("file: %1 time:%2").arg(file).arg(t.elapsed());
            total += t.elapsed();
            DEBUG(str);
            ui->textBrowser_2->append(str);
        }
    }
    ui->textBrowser_2->append(QString("total time : %1").arg(total));

3.image加载文件只记录转换成pixmap的时间

total = 0;
    for(int index = 0; index < _dirs; index++)
    {
        for(int index2 = 0; index2 < _count; index2++)
        {
            QElapsedTimer t;
            QString file = QString("./images/images%1/%2.jpg").arg(index+1).arg(index2+1);
            // 使用QImage直接加载文件,再转换成pixmap
            DEBUG(file);
            QImage image;//转换成QImage
            image.load(file);
            t.start();
            QPixmap bmp;
            bmp = QPixmap::fromImage(image);//转换成QPixmap
            QString str = QString("file: %1 time:%2").arg(file).arg(t.elapsed());
            total += t.elapsed();
            DEBUG(str);
            ui->textBrowser_3->append(str);
        }
    }
    ui->textBrowser_3->append(QString("total time : %1").arg(total));

4.rgb数据赋值给image转换成pixmap的时间

total = 0;
    for(int index = 0; index < _dirs; index++)
    {
        for(int index2 = 0; index2 < _count; index2++)
        {
            QElapsedTimer t;
            QString file = QString("./images/images%1/%2.jpg").arg(index+1).arg(index2+1);
            QImage image;//转换成QImage
            image.load(file);
            QByteArray byteArray;
            for(int h = 0; h < image.height(); h++)
            {
                for(int w = 0; w < image.width(); w++)
                {
                    QColor color = image.pixelColor(w, h);
//                    qDebug() << __FILE__ << __LINE__ << color.alpha() << (char)color.red() << (char)color.green() << (char)color.blue();
//                    byteArray.append((uchar)color.alpha());
                    // uchar 输入 gba 给 image当uchar *
//                    、QImage::Format_RGB32,存入格式为B,G,R,A 对应 0,1,2,3
//                        QImage::Format_RGB888,存入格式为R, G, B 对应 0,1,2
//                        QImage::Format_Indexed8,需要设定颜色表,QVector<QRgb>
                    byteArray.append((uchar)color.blue());
                    byteArray.append((uchar)color.green());
                    byteArray.append((uchar)color.red());
                    byteArray.append((uchar)color.alpha());
//                    if(w == 0 && h == 0)
//                        qDebug() << __FILE__ << __LINE__ << byteArray.toHex();
                }
            }
            t.start();
            QImage image2((uchar *)byteArray.data(), image.width(), image.height(), QImage::Format_RGB32);
//            QImage image2((uchar *)byteArray.data(), 1, 1, QImage::Format_RGB32);
            QPixmap bmp;
            bmp = QPixmap::fromImage(image2);//转换成QPixmap
            QString str = QString("file: %1 time:%2 width:%3 height:%4").arg(file).arg(t.elapsed()).arg(image2.width()).arg(image2.height());
            total += t.elapsed();
//            qDebug() << __FILE__ << __LINE__ << image.width() << image.height() << image2.width() << image2.height();
//            image2.pixel(0, 0);
            if(image.pixel(1000, 1000) == image2.pixel(1000,1000))
                ui->textBrowser_4->append(str);
//            for(int h = 0; h < image2.height(); h++)
//            {
//                for(int w = 0; w < image2.width(); w++)
//                    ;
//                int w = 1000;
//                qDebug() << __FILE__ << __LINE__ << w << h << image.pixel(w, h) << image2.pixel(w, h) << byteArray.size();
//            }
                DEBUG(str);
        }
    }
    ui->textBrowser_4->append(QString("total time : %1").arg(total));

5.rgb数据赋值给image只记录转换成pixmap的时间

    total = 0;
    for(int index = 0; index < _dirs; index++)
    {
        for(int index2 = 0; index2 < _count; index2++)
        {
            QElapsedTimer t;
            QString file = QString("./images/images%1/%2.jpg").arg(index+1).arg(index2+1);
            QImage image;//转换成QImage
            image.load(file);
            QByteArray byteArray;
            for(int h = 0; h < image.height(); h++)
            {
                for(int w = 0; w < image.width(); w++)
                {
                    QColor color = image.pixelColor(w, h);
//                    qDebug() << __FILE__ << __LINE__ << color.alpha() << (char)color.red() << (char)color.green() << (char)color.blue();
//                    byteArray.append((uchar)color.alpha());
                    // uchar 输入 gba 给 image当uchar *
                    byteArray.append((uchar)color.blue());
                    byteArray.append((uchar)color.green());
                    byteArray.append((uchar)color.red());
                    byteArray.append((uchar)color.alpha());
                }
            }
            QImage image2((uchar *)byteArray.data(), image.width(), image.height(), QImage::Format_RGB32);
            t.start();
            QPixmap bmp;
            bmp = QPixmap::fromImage(image2);//转换成QPixmap
            QString str = QString("file: %1 time:%2 width:%3 height:%4").arg(file).arg(t.elapsed()).arg(image2.width()).arg(image2.height());
            total += t.elapsed();
//            qDebug() << __FILE__ << __LINE__ << image.width() << image.height() << image2.width() << image2.height();
//            image2.pixel(0, 0);
            if(image.pixel(1000, 1000) == image2.pixel(1000,1000))
                ui->textBrowser_5->append(str);
            DEBUG(str);
        }
    }
    ui->textBrowser_5->append(QString("total time : %1").arg(total));

 

原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/79562841

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!要将DICOM文件中的每一帧转换为QImage,您可以使用DCMTK库和Qt来实现。以下是一个示例代码片段,展示了如何进行此转换: ```cpp #include <dcmtk/config/osconfig.h> #include <dcmtk/dcmdata/dctk.h> #include <dcmtk/dcmimgle/dcmimage.h> #include <QtGui/QImage> QImage convertDicomFrameToQImage(const char* dicomFilePath, int frameIndex) { // 加载DICOM文件 DcmFileFormat fileFormat; if (fileFormat.loadFile(dicomFilePath).good()) { // 获取DICOM图像 DicomImage* dcmImage = new DicomImage(fileFormat.getDataset(), EXS_Unknown); // 检查DICOM图像是否可用 if (dcmImage && dcmImage->getStatus() == EIS_Normal) { // 设置要解码的帧索引 dcmImage->setFrameToConvert(frameIndex); // 解码DICOM图像帧到内存 if (dcmImage->decodeFrame().good()) { // 获取解码后的图像数据和相关属性 const DiPixel* diPixel = dcmImage->getInterData(); const unsigned char* pixelData = (const unsigned char*)diPixel->getData(); const unsigned long width = diPixel->getWidth(); const unsigned long height = diPixel->getHeight(); const unsigned long numComponents = diPixel->getPlanes(); // 创建QImage对象 QImage image(pixelData, width, height, QImage::Format_RGB888); // 如果图像具有多个分量,则进行颜色空间转换 if (numComponents > 1) { image = image.convertToFormat(QImage::Format_RGB888); } // 返回转换后的QImage return image; } } } // 如果转换失败,则返回一个空的QImage return QImage(); } ``` 要使用此函数,您可以将DICOM文件的路径和要转换的帧索引传递给它,然后它将返回相应的QImage对象。请注意,此示例假定输入DICOM文件中的像素数据以RGB格式存储。如果您的DICOM文件使用不同的像素格式(例如灰度图像),则需要相应地调整代码。 希望这可以帮助到您!如果您有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长沙红胖子Qt(长沙创微智科)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值