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++; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探