QT使用GZip进行数据压缩

10 篇文章 0 订阅

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

之前使用QT进行TCP传输数据,如果碰到大文件的传输会导致传输数据巨大。由于通信格式使用json,其不支持二进制数据的传输,所以要将二进制数据转换为base64进行传输,这样数据量会增加30%左右,因此现在将json格式后的数据使用Gzip进行压缩,节省大量流量


一、编译zlib库

1.下载zlib

下载地址:Zlib官网

2.编译

将win32\makefile.gcc拷贝到zlib源码的根目录
使用QtCreator集成安装的mingw编译zlib
命令: mingw32-make -f makefile.gcc
文件夹会出现libz.a

二、QT导入

1.引入库

通过QtCreator 右键项目==>添加库==>外部库 选择libz.a 后,项目的proto文件会自动加入一下项目

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/zlib/ -lz
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/zlib/ -lzd
else:unix: LIBS += -L$$PWD/zlib/ -lz

2.导入zlib头文件

#include “zlib.h”
#include “zconf.h”

3.QT使用zlib进行Gzip解压缩代码

QByteArray GzipCompress(QByteArray postBody)
{
    QByteArray outBuf;
    z_stream c_stream;
    int err = 0;
    int windowBits = 15;
    int GZIP_ENCODING = 16;
    if (!postBody.isEmpty())
    {
        c_stream.zalloc = (alloc_func)0;
        c_stream.zfree = (free_func)0;
        c_stream.opaque = (voidpf)0;
        c_stream.next_in = (Bytef *)postBody.data();
        c_stream.avail_in = postBody.size();
        if (deflateInit2(&c_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
            MAX_WBITS + GZIP_ENCODING, 8, Z_DEFAULT_STRATEGY) != Z_OK) return QByteArray();
        for (;;) {
            char destBuf[4096] = { 0 };
            c_stream.next_out = (Bytef *)destBuf;
            c_stream.avail_out = 4096;
            int err = deflate(&c_stream, Z_FINISH);
            outBuf.append(destBuf, 4096 - c_stream.avail_out);
            if (err == Z_STREAM_END || err != Z_OK)
            {
                break;
            }
        }
        auto total = c_stream.total_out;
        deflateEnd(&c_stream);
        total = c_stream.total_out;
    }
    return outBuf;
}


QByteArray GZipUnCompress(QByteArray src)
{
    QByteArray outBuffer;
    z_stream strm;
    strm.zalloc = NULL;
    strm.zfree = NULL;
    strm.opaque = NULL;

    strm.avail_in = src.size();
    strm.next_in = (Bytef *)src.data();

    int err = -1, ret = -1;
    err = inflateInit2(&strm, MAX_WBITS + 16);
    if (err == Z_OK) {
        while (true)
        {
            char buffer[4096] = { 0 };
            strm.avail_out = 4096;
            strm.next_out = (Bytef *)buffer;
            int code = inflate(&strm, Z_FINISH);
            outBuffer.append(buffer, 4096 - strm.avail_out);
           // qDebug()<<"ddd"<<code<<Z_OK;
            if (Z_STREAM_END == code )
            {
                break;
            }
        }
    }
    inflateEnd(&strm);
    return outBuffer;
}

总结

项目链接:链接

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt使用 OpenCV 3 设置压缩格式的步骤如下: 1. 首先,需要在 Qt 中添加 OpenCV 库。在 .pro 文件中添加以下语句: ``` INCLUDEPATH += /usr/local/include/opencv LIBS += /usr/local/lib/libopencv_*.so ``` 其中,`/usr/local` 是 OpenCV 库的安装路径,`_*.so` 表示需要链接的 OpenCV 库的名称,这里使用通配符 `_*.so` 表示链接所有的 OpenCV 库。 2. 在 Qt使用 OpenCV 的 VideoCapture 类读取视频文件,然后设置压缩格式。以下是示例代码: ``` #include <opencv2/opencv.hpp> using namespace cv; int main() { VideoCapture cap("test.mp4"); if (!cap.isOpened()) { qDebug() << "Error opening video file"; return -1; } int codec = CV_FOURCC('H', '2', '6', '4'); // 设置压缩格式为 H264 double fps = cap.get(CAP_PROP_FPS); int width = cap.get(CAP_PROP_FRAME_WIDTH); int height = cap.get(CAP_PROP_FRAME_HEIGHT); VideoWriter writer("output.avi", codec, fps, Size(width, height), true); Mat frame; while (cap.read(frame)) { writer.write(frame); } cap.release(); writer.release(); return 0; } ``` 在上述代码中,首先使用 `VideoCapture` 类打开视频文件,然后使用 `CV_FOURCC` 宏定义设置压缩格式为 H264。接着,获取视频的帧率、宽度和高度,然后使用 `VideoWriter` 类创建一个输出视频文件,并设置压缩格式、帧率、宽度和高度。最后,循环读取视频文件中的每一帧图像,并将其写入输出视频文件中。循环结束后,关闭输入和输出视频文件。 注意:不同的压缩格式对应的 `CV_FOURCC` 宏定义可能不同,具体可以参考 OpenCV 官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值