Qt 图片通过网络Tcp传输——OpenCV的图片编码函数imencode()

在工程应用中,通常有需要用网络传输图片的需求,考虑网络带宽的限制,无法直接将原始图片进行传输。

常用的两种压缩方式有png、jpeg, png是无损压缩,jpeg是有损压缩;因此png图片文件尺寸略大,jpeg图像有一定的失真。

可以使用opencv中的imencode与imdecode函数进行图像压缩与解压

 

 

例子2:

Mat img;
int quality = 50; //压缩比率0~100
vector<uint8_t> imageData;
vector<int> compress_params;
compress_params.push_back(IMWRITE_JPEG_QUALITY);
compress_params.push_back(quality);
imencode(".jpg", frame, imageData, compress_params);

 

我写的函数:


/*
 *@func:将图片数据发送给服务器
*/
void MainWindow::send_img_to_server(cv::Mat &img)
{
    //0.如果没有连接上服务器,直接返回
    if(!connect_stat) return;

    bool ret = false;
    //1. 将发送的图片编码,转换为vector<uchar>类型,再转换为QByteArray类型
    std::vector<uchar> img_vbuf;
    //设置im_encode 压缩参数,然后调用imencode
    int quality = 30; //压缩比率0~100
    std::vector<int> compress_params = std::vector<int>(2);
    compress_params[0] = (IMWRITE_JPEG_QUALITY);
    compress_params[1] = (quality);

    ret = imencode(".jpg",img,img_vbuf, compress_params);//关键的函数
    if(ret == false)
    {
        qDebug() << "encode JPG failed ";
        return;
    }
    QByteArray img_ba((const char*)img_vbuf.data(), img_vbuf.size());//发送数据的第二项
    qDebug() << "img's size = "<< img_vbuf.size();

    //2. 准备新的QByteArray,包含图片数据的大小+图片数据,通过QDataStream传入里面。
    quint64 img_ba_size = img_ba.size();//发送数据的第一项
    QByteArray send_ba;//与stream绑定的ByteArray

    QDataStream stream_out(&send_ba, QIODevice::WriteOnly);//设置输出stream的数据对象
    stream_out.setVersion(QDataStream::Qt_5_12);
    //stream_out << img_ba_size << send_ba;//这里错了,不应该是send_ba
    stream_out<<img_ba_size<<img_ba;

    //3. 通过tcp通信将数据发送出去
    m_socket.write(send_ba);
}

 

posted @ 2024-04-25 14:40  FBshark  阅读(269)  评论(0编辑  收藏  举报