随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

Qt+OpenCV实现多图片压缩

一、概述

  需求:

    1.打开指定文件夹选择jpeg/png图片

    2.可以选择多张

    3.获取多张图片路径,并存入集合

    4.计算原始图像的占盘占用大小

    5.根据后罪名来判断压缩方式

    6.压缩成功后保存到另外一个文件夹中

    7.计算压缩后的文件并输出

  如下图展示压缩效果(压缩前磁盘占用大小对比)

 

二、代码示例

  1.Qt选择多张图片弹框,并获取选择后的文件路径集合示例

QStringList list = QFileDialog::getOpenFileNames(this, tr("请选择多个文件"), "C:/Users/DBF-DEV-103/Downloads/", tr("Images (*.jpg *.png)"));
for (QString filePath : list) {
    qDebug() << "filePath:" << filePath;
}

  2.Qt获取文件后缀名示例

QFileInfo fileInfo = QFileInfo(mFilePath);
//获取文件后缀名
QString  fileSuffix = fileInfo.suffix();
qDebug() << "文件的后缀名为:" << fileSuffix;

  3.C++计算文件占用磁盘大小示例

复制代码
long ImageCompressTool::matSizeInKB(std::string filePath) {
    std::ifstream mFile(filePath, std::ifstream::binary);
    if (mFile) {
        mFile.seekg(0, mFile.end);
        long size = mFile.tellg(); // 获取文件大小(字节)
        mFile.close();
        return size / 1024; // 转换为KB
    }
    return -1; // 文件打开失败,返回-1
}
复制代码

  4.使用Qt+OpenCV实现完整的图片压缩代码示例

复制代码
//一次性压缩多张图片
void ImageCompressTool::compressImages() {
    if (this->filePaths.empty()) {
        QMessageBox::information(this, "温馨提示", "请选择图片");
        return;
    }
    int index = 0;
    for (QString mFilePath : this->filePaths) {
        QFileInfo fileInfo = QFileInfo(mFilePath);
        //获取文件后缀名
        QString  fileSuffix = fileInfo.suffix();
        qDebug() << "文件的后缀名为:" << fileSuffix;
        if (fileSuffix == "jpeg" || fileSuffix == "jpg") {
            imageType = 0;
            this->mKsize = 30;
        }
        else if (fileSuffix == "png") {
            imageType = 1;
            this->mKsize = 9;
        }
        cv::Mat src = cv::imread(mFilePath.toStdString().c_str());
        double srcKb = matSizeInKB(mFilePath.toStdString());
        std::vector<int> compression_params;
        if (imageType == 0) {
            compression_params.push_back(cv::IMWRITE_JPEG_QUALITY);
            //压缩级别范围从0~100,值越小压缩率越高,即在磁盘占用的空间越小,相应的图片的质量越差
            compression_params.push_back(mKsize);
        }
        else {
            compression_params.push_back(cv::IMWRITE_PNG_COMPRESSION);
            if (mKsize > 10) {
                mKsize = 3;
            }
            compression_params.push_back(mKsize); // 压缩级别范围从0到9,9是最高压缩
        }
        //将图片以jpg的格式存入文件
        QString compressImgPath = "E://";
        //char* compressImgPath = "E://opencv_compress_img.jpeg";
        if (imageType == 1) {
            compressImgPath.append("opencv_compress_img").append("(").append(QString::number(index + 1)).append(")").append(".png");
        }
        else {
            compressImgPath.append("opencv_compress_img").append("(").append(QString::number(index + 1)).append(")").append(".jpeg");
        }
        bool result = cv::imwrite(compressImgPath.toStdString().c_str(), src, compression_params);
        if (!result) {
            qDebug() << "压缩图片失败";
            return;
        }
        double compressSizeKb = matSizeInKB(compressImgPath.toStdString().c_str());
        qDebug() << "(" << index + 1 << ")" << "压缩前:" << srcKb << "KB:" << mFilePath;
        qDebug() << "(" << index + 1 << ")" << "压缩后:" << compressSizeKb << "KB:" << compressImgPath;
        index++;
    }
复制代码

 

posted on   飘杨......  阅读(142)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示