qt--压缩图片的大小

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

头文件部分

cpp 复制代码
    /*!
     * @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);

实现部分

cpp 复制代码
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();
}
相关推荐
m0_726365833 小时前
哈希分分预测系统 打造自适应趋势分析「Python+DeepSeek+PyQt5」
python·qt·哈希算法
new_zhou4 小时前
vs2019+qt工程中生成dump文件及调试
开发语言·qt·visual studio·dump调试
hqwest5 小时前
码上通QT实战16--监控页面08-连接后状态处理
qt·串口·信号与槽·serialport·通信过程·打开串口·com1
hqwest7 小时前
码上通QT实战15--监控页面07-打开串口连接
开发语言·qt·多线程·signal·slot·emit·信号和槽
CS Beginner9 小时前
【单片机】嵌入式显示屏开发框架:QT、SDL、LVGL 深度解析
单片机·嵌入式硬件·qt
金色熊族9 小时前
MV结构下设置Qt表格的代理(2)
c++·qt
Morwit10 小时前
Qt qml创建c++类的单例对象
开发语言·c++·qt
YxVoyager10 小时前
Qt C++ :QRegularExpression 正则表达式使用详解
c++·qt·正则表达式
qq_4017004110 小时前
QStackedLayout 实现遮罩层
qt
Larry_Yanan10 小时前
Qt多进程(十一)Linux下socket通信
linux·开发语言·c++·qt