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);
}