qt--压缩图片的大小

embedded/2024/9/25 15:07:05/

该函数 是输入图片的字节流 然后再内部转换后输出文件的字节流
头文件部分

    /*!* @brief compressImage* @param format    图片的压缩格式* @param imageByteArray    源图像字节流* @param fileSize  压缩指定的文件大小 默认180kb* @param limitHeight 限制图片的高度* @return QByteArray  压缩后的图片字节流*/static QByteArray compressImage(const QByteArray imageByteArray, const char *format = nullptr, int fileSize = 180 * 1024, int limitHeight = 1000);

实现部分

QByteArray ImageUtil::compressImage(const QByteArray imageByteArray, const char *format, int fileSize, int limitHeight) {qInfo() << "传入图片大小" << imageByteArray.size();if (imageByteArray.size() < fileSize) {qInfo() << "图片满足要求,无需压缩";return imageByteArray;}qInfo() << "开始压缩图片";int quality = 100;QImage srcImg;QPixmap pixmap;srcImg.loadFromData(imageByteArray);QBuffer buff;double scale = 1;QSize imgSize = srcImg.size();// 压缩图片的尺寸 控制在limitHeight以内if (imgSize.height() > limitHeight)scale = ( double )limitHeight / ( double )imgSize.height();imgSize = imgSize.scaled(imgSize.width() * scale, imgSize.height() * scale, Qt::IgnoreAspectRatio);// 图片等比例缩放pixmap = pixmap.fromImage(srcImg.scaled(imgSize, Qt::IgnoreAspectRatio, Qt::FastTransformation));// 压缩图片的质量 控制在fileSize之内qint64 fsz;while (true) {QBuffer tempBuff;// 图片降低质量bool isOk = pixmap.save(&tempBuff, format, quality);quality = quality - 2;if (quality <= 0)break;fsz = tempBuff.size();if (isOk) {if (fsz <= fileSize) {pixmap.save(&buff, format, quality);break;}}}qInfo() << "现在图片大小" << fsz << "要求图片大小" << fileSize << "质量系数" << quality << "图片宽高" << imgSize.width() << imgSize.height();return buff.data();
}

http://www.ppmy.cn/embedded/116676.html

相关文章

加速AI数据应用,肯睿Cloudera推出六款全新机器学习项目加速器AMPs

肯睿Cloudera大中华区技术总监刘隶放表示&#xff1a;“随着中国企业对人工智能的需求日益增长&#xff0c;如何快速、安全地将AI技术落地成为企业的核心诉求。Cloudera全新推出的AMPs不仅为企业提供了可一键部署的AI解决方案&#xff0c;更通过开源的方式缩短企业部署时间&…

Angular面试题五

一、请解释Angular中的管道是什么&#xff0c;并列举几个内置的管道。 Angular中的管道&#xff08;Pipe&#xff09;是一种强大的工具&#xff0c;用于在Angular模板中处理和转换数据&#xff0c;并将其呈现给用户。管道可以将输入数据&#xff08;如字符串、数字、日期等&…

论文阅读--Planning-oriented Autonomous Driving(一)

文献中涉及的主要知识点梳理及所提框架简介&#xff1a; 自动驾驶系统的模块化&#xff1a;现代自动驾驶系统通常被分解为顺序执行的模块化任务&#xff0c;包括感知&#xff08;perception&#xff09;、预测&#xff08;prediction&#xff09;和规划&#xff08;planning&am…

【AI 写作】介绍 Apache Spark 的基本概念和在大数据分析中的应用

【AI 写作】介绍 Apache Spark 的基本概念和在大数据分析中的应用 浅浅的玩一下这个 AI 写作&#xff0c;本内容全为 AI 生成&#xff0c;仅为 AI 观点&#xff0c;无作者本人的观点。 Apache Spark是一个开源的大数据处理框架&#xff0c;设计用于高效处理大规模数据集和实现…

分布式变电站电力监控系统

变电站电力监控系统能提供必要的实时运行信息&#xff0c;尤其是开关和保护行为的信息&#xff08;事故报警信息&#xff09;&#xff0c;使值班人员和系统调度人员把握安全控制、事故处理的主动性&#xff0c;同时可以提高电网的运行管理水平&#xff0c;减少变电、配电损失&a…

Leetcode面试经典150题-97.交错字符串

给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串 &#xff1a; s s1 s2 ... snt t1 t2 ... tm|n - m| < 1交错 是…

Vue:默认插槽

目录 一.性质 1.内容分发 2.无名称标识 3.作用域 4.使用方式 二.使用 1.父组件 2.子组件 三.代码 1.父组件代码 2.子组件代码 四.效果 一.性质 1.内容分发 默认插槽允许组件的使用者定义一些内容&#xff0c;这些内容会被插入到组件模板中的特定位置。这有助于实…

Linux环境变量进程地址空间

目录 一、初步认识环境变量 1.1常见的环境变量 1.2环境变量的基本概念 二、命令行参数 2.1通过命令行参数获取环境变量 2.2本地变量和内建命令 2.3环境变量的获取 三、进程地址空间 3.1进程&#xff08;虚拟&#xff09;地址空间的引入 3.2进程地址空间的布局和理解 …