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 2024-05-16 10:55  飘杨......  阅读(165)  评论(0)    收藏  举报