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();
}
相关推荐
SilentSlot3 小时前
【QT-QML】5. 简单变换
qt·qml
云中飞鸿11 小时前
VS2015安装后,安装QT59,之后安装qt-vsaddin-msvc2015-2.4.3.vsix 文件失败问题!
开发语言·qt
凯子坚持 c11 小时前
Qt常用控件指南(9)
开发语言·qt
创客小邓13 小时前
Qt对SQLite数据库的操作
数据库·qt·sqlite
小小码农Come on14 小时前
QT布局介绍
开发语言·qt
云中飞鸿14 小时前
QTCreator error: C3861: “_mm_loadu_si64”: 找不到标识符
qt
CodeByV14 小时前
【Qt】信号与槽
开发语言·qt
枫叶丹414 小时前
【Qt开发】Qt系统(十一)-> Qt 音频
c语言·开发语言·c++·qt·音视频
qq_397562311 天前
QT工程 , 生成别的电脑运行的exe程序
嵌入式硬件·qt
轩情吖1 天前
Qt的窗口
开发语言·c++·qt·窗口·工具栏·桌面级开发