首页 > 其他分享 >Qt+OpenCV实现图片压缩(JPEG、PNG)

Qt+OpenCV实现图片压缩(JPEG、PNG)

时间:2025-01-17 10:10:56浏览次数:1  
标签:Qt 压缩 JPEG OpenCV vLayout addWidget new setText 图片

一、概述

  需求:

    1.编写一个小工具实现图片压缩

    2.图片仅支持JPEG和PNG格式

    3.目的是压缩图片在磁盘中所占用的大小

    4.使用的开发语言是Qt、C++、OpenCV

    5.压缩的质量可以动态调节

    如下图所示:

  ps:

    1.如果图片是jpeg压缩质量可以设置10~100,值越大质量越好,图片所占用的磁盘空间也就越大。综合测试下来值设置30的时候压缩的最为合理,且图片不失真,如果图片要求质量较高建议设置40以上。

    2.如果图片是png格式,压缩质量是从0~9,值越大压缩率越高,如果没有特殊要求直接设置压缩率为9,直接压缩到最小就行。

二、代码示例

点击查看代码

#include "ImageCompressTool.h"

ImageCompressTool::ImageCompressTool(QWidget* parent)
    : CommonGraphicsView{ parent }
{
    this->setWindowTitle("图片压缩");
    this->setFixedSize(QSize(320, 800));
    QVBoxLayout* vLayout = new QVBoxLayout(this);

    QHBoxLayout* hLayout = new QHBoxLayout(this);
    EditText* et = new EditText(this);
    et->setEnabled(false);
    et->setFixedHeight(30);
    Button* btnChoiceBtn = new Button(this);
    btnChoiceBtn->setText("请选择图片");


    hLayout->addWidget(et);
    hLayout->addWidget(btnChoiceBtn);
    hLayout->setAlignment(Qt::AlignTop);

    QHBoxLayout* radioTypeHLayout = new QHBoxLayout(this);
    QButtonGroup* group = new QButtonGroup(this);
    QRadioButton* radioButtonJPEG = new QRadioButton("JPEG", this);
    radioButtonJPEG->setFixedSize(60, 30);
    QRadioButton* radioButton2PNG = new QRadioButton("PNG", this);
    radioButton2PNG->setFixedSize(60, 30);
    group->addButton(radioButtonJPEG, 1);
    group->addButton(radioButton2PNG, 2);
    radioTypeHLayout->addWidget(radioButtonJPEG);
    radioTypeHLayout->addWidget(radioButton2PNG);
    radioTypeHLayout->setAlignment(Qt::AlignLeft);

    //图片质量(JPEG)
    qualitLabel = new QLabel(this);
    qualitLabel->setText("图片质量:" + QString::number(mKsize));
    qualitLabel->setFixedHeight(15);
    //显示原图大小(KB)
    srcImageKb = new QLabel(this);
    srcImageKb->setText("原图大小:");
    srcImageKb->setFixedHeight(15);
    //显示压缩后图片大小(KB)
    compressImageKb = new QLabel(this);
    compressImageKb->setText("压缩后图片大小:");
    compressImageKb->setFixedHeight(15);
    //开始压缩按钮
    Button* startCompressBtn = new Button(this);
    startCompressBtn->resize(60, 30);
    startCompressBtn->setText("开始压缩");


    QLabel* comBoxLabel = new QLabel(this);
    comBoxLabel->setText("请选择图片质量:");
    comBoxLabel->setFixedHeight(15);
    //ComBox选择图片质量
    comBox = new ComboBox(this);
    for (int i = 10;i <= 100;i += 10) {
        comBox->addItem(QString::number(i));
    }
    QHBoxLayout* comBoxHLayout2 = new QHBoxLayout(this);
    comBoxHLayout2->addWidget(comBoxLabel);
    comBoxHLayout2->addWidget(comBox);

    imageViewResult = new QLabel(this);

    vLayout->addLayout(hLayout);
    vLayout->addLayout(radioTypeHLayout);
    //vLayout->addWidget(imageViewSrc);
    vLayout->addWidget(imageViewResult);
    vLayout->setAlignment(Qt::AlignTop);

    vLayout->addWidget(qualitLabel);
    vLayout->addWidget(srcImageKb);
    vLayout->addWidget(compressImageKb);
    vLayout->addLayout(comBoxHLayout2);
    vLayout->addWidget(startCompressBtn);
    this->setLayout(vLayout);

    connect(btnChoiceBtn, &Button::clicked, this, [=]() {
        QFileInfo fileInfo;
        filePath = QFileDialog::getOpenFileName(this, tr("请选择图片"), "C:/Users/DBF-DEV-103/Downloads/", tr("Image Files(*.jpg *.png  *.jpeg)"));
        et->setText(filePath);
        fileInfo = QFileInfo(filePath);
        //获取文件后缀名
        QString  fileSuffix = fileInfo.suffix();
        qDebug() << "文件的后缀名为:" << fileSuffix;
        if (fileSuffix == "jpeg" || fileSuffix == "jpg") {
            imageType = 0;
            radioButtonJPEG->setChecked(true);
            comBox->clear();
            for (int i = 10;i <= 100; i += 10) {
                comBox->addItem(QString::number(i));
            }
        }
        else if (fileSuffix == "png") {
            imageType = 1;
            radioButton2PNG->setChecked(true);
            comBox->clear();
            for (int i = 0;i <= 10; i++) {
                comBox->addItem(QString::number(i));
            }
        }
        //compressImage();
        });


    //选择了JPEG
    connect(radioButtonJPEG, &QRadioButton::clicked, this, [=]() {
        imageType = 0;
        qDebug() << "图片类型" << imageType;
        });
    //选择了PNG
    connect(radioButton2PNG, &QRadioButton::clicked, this, [=]() {
        imageType = 1;
        qDebug() << "图片类型:" << imageType;
        });

        //开始压缩按钮信号槽(点击事件)
    connect(startCompressBtn, &Button::clicked, this, [=]() {
        compressImage();

        });

    //选择图片质量信号槽
    connect(comBox, &ComboBox::currentTextChanged, [=](const QString value) {
        qDebug() << "选择的value值:" << value;
        mKsize = value.toInt();
        qualitLabel->setText("图片质量:" + QString::number(mKsize));
        });

}
//压缩图片
void ImageCompressTool::compressImage() {
    cv::Mat src = cv::imread(this->filePath.toStdString().c_str());
    //imshow("src", src);
    double srcKb = matSizeInKB(filePath.toStdString());
    srcImageKb->setText("原图大小:" + QString::number(srcKb));
    std::cout << "原图大小:" << srcKb << std::endl;
    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的格式存入文件
    char* compressImgPath = "E://opencv_compress_img.jpeg";
    if (imageType == 1) {
        compressImgPath = "E://opencv_compress_img.png";
    }
    bool result = cv::imwrite(compressImgPath, src, compression_params);
    if (!result) {
        std::cout << "压缩图片失败" << endl;
        return;
    }
    QFile compressFile = QFile(compressImgPath);
    double compressSizeKb = matSizeInKB(compressImgPath);
    compressImageKb->setText("压缩后的图片大小:" + QString::number(compressSizeKb));
    std::cout << "压缩后的图片大小为:" << compressSizeKb << std::endl;
    std::cout << "压缩图片成功,存储路径为:" << compressImgPath << std::endl;
}

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
}

ImageCompressTool::~ImageCompressTool()
{
}

标签:Qt,压缩,JPEG,OpenCV,vLayout,addWidget,new,setText,图片
From: https://www.cnblogs.com/Ryan9399/p/18676372

相关文章

  • qt switchbutton
    qt实现的SwitchButton,从网上抄的代码,然后进行一些修改完善,如下switchbutton.h点击查看代码#ifndefSWITCHBUTTON_H#defineSWITCHBUTTON_H#include<QObject>#include<QWidget>#include<QTimer>#include<QColor>#include<QDebug>#definemyDebugqDebu......
  • opencv实现像素统计的示例代码
    在OpenCV中,统计图像的像素信息(如像素值分布、最大值、最小值、均值等)是常见的操作。以下是一些常用的方法和函数,用于统计图像的像素信息:统计像素值的基本信息最大值、最小值、均值、标准差:使用cv::minMaxLoc()和cv::meanStdDev()函数可以快速计算图像的最大值、最小值......
  • 【pyqt】pyqt写一个工具 实现base64编码,解码
    解决思路:使用QSS(QtStyleSheets)对PyQt控件的样式进行定制。为不同的控件添加不同的样式,如背景颜色、字体、边框等。修改后的代码:importsysimportbase64fromPyQt5.QtWidgetsimportQApplication,QWidget,QVBoxLayout,QHBoxLayout,QTextEdit,QPushButton,QLine......
  • Opencv 的下载安装和VisualStudio配置
    Opencv的下载安装和VisualStudio配置1opencv-windows的下载1.1github直接下载链接(需要外网链接)最新4.10.0版本的下载链接为:https://github.com/opencv/opencv/releases/download/4.10.0/opencv-4.10.0-windows.exe1.2官网下载其他版本官网链接:https://opencv.org/rele......
  • OpenCV相机标定与3D重建(58)用于精细化优化由 cv::solvePnP 或 cv::solvePnPRansac 等
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述从3D-2D点对应关系出发,并基于一个初始解,精细化姿态(将物体坐标系中的3D点变换到相机坐标系的旋转和平移)。cv::solvePnPRefineVVS是OpenCV中用于精细化优化由cv::solvePnP或c......
  • OpenCV相机标定与3D重建(57)精细化优化由 cv::solvePnP 或 cv::solvePnPRansac 等函数
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述从3D-2D点对应关系出发,并基于一个初始解,精细化姿态(将物体坐标系中的3D点变换到相机坐标系的旋转和平移。cv::solvePnPRefineLM是OpenCV中用于精细化优化由cv::solvePnP或cv......
  • qt通信:串口通信
    好久没有使用串口通信,所以有些数据老是忘记,所以找了个时间总结一下,下次可以直接复制,不用再写了。1.在工程文件.pro文件中加入QT+=serialport2.之后点击构建,执行一次qmake在窗口类的头文件中,加入串口通信用到的头文件#include<QtSer......
  • 高级QT Widgets图形绘制技巧
    高级QTWidgets图形绘制技巧补天云火鸟博客创作软件补天云网站1Qt_Widgets基础与图形系统1.1Qt_Widgets概述1.1.1Qt_Widgets概述Qt_Widgets概述QtWidgets概述引言在软件开发领域,Qt框架因其跨平台性、强大的图形界面设计能力以及丰富的类库支持而备受开发者青睐......
  • 电脑干货:推荐一款秒开几十M图片文件、完全免费、无广告的看图神器JPEGView
    目录一、软件介绍二、功能特点三、使用体验四、与其他看图软件的比较五、总结 今天给大家分享一款名为JPEGView的开源免费看图软件。安装包仅1M左右、占用系统资源极小。并且该软件支持格式有70多种,支持幻灯片/电影模式播放图片,看图体验很好!是一款非常优秀的Win......
  • pyqt+mysql实现学生学籍管理系统(带.sql和.ui文件)
    所有文件已经上传至https://github.com/shuimqy/Student-Information-Management-System-implemented-with-Qt.git需要的话可自行下载,自己写的数据库大作业,尽量不要照搬提交。如果对你有帮助的话,点个赞吧,有问题欢迎留言!下面是我的涉及过程即设计报告。需求分析概念结构......