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();
}
相关推荐
用户8055336980314 小时前
现代Qt开发教程(新手篇)1.10——进程
c++·qt
vegetablesssss14 小时前
VTK切割图
c++·qt·vtk
Lhan.zzZ16 小时前
笔记_2026.4.28_003
c++·笔记·qt·opencv
m0_6356474816 小时前
Qt打包含有第三方库的软件为应用程序——CQtDeployer
开发语言·数据库·qt
菩提树下的凡夫19 小时前
Qt环境下普通变量与原子变量的区别与联系
qt
小短腿的代码世界1 天前
Qt文件系统与IO深度解析:从QFile到异步文件操作
开发语言·qt
徐某人..1 天前
基于i.MX6ULL平台的智能网关系统开发
arm开发·c++·单片机·qt·物联网·学习·arm
(Charon)1 天前
【C++/Qt】Qt 封装 TCP 客户端底层 Network 类:连接、收发、自动测试与错误处理
服务器·网络·qt·tcp/ip
小短腿的代码世界2 天前
QCefView深度解析:Qt应用中嵌入Chromium浏览器的终极方案
开发语言·qt