如何解决使用 boost 库在 websocket 上传输图像
我想使用 boost 库在 websocket 上传输图像数据。
首先,我通过参考以下 URL 确认能够传输和接收文本数据。 https://www.boost.org/doc/libs/1_68_0/libs/beast/doc/html/beast/quick_start.html
接下来,虽然我尝试传输图像,但我收到以下错误消息。
websocket_client.cpp:563:38: error: no matching function for call to 'buffer(cv::Mat&)'
ws.write(boost::asio::buffer(img));
我所做的如下。
-
使用 opencv 将图像文件读取为 'img'。
-
更改传输数据的代码
// Send the message // ws.write(boost::asio::buffer(std::string(text))); ws.write(boost::asio::buffer(img));
解决方法
cv::Mat 不是缓冲区类型或适应性。如果你有 POD 数据,那么你可以像评论者说的那样“投射”它:
// don't do this:
buffer(&img,sizeof(img));
然而,这并不安全:
static_assert(std::is_standard_layout_v<cv::Mat>);
static_assert(std::is_trivial_v<cv::Mat>);
该类型实际上是不可按位复制的。但是因为有一个矩阵,所以可能有一个连续的数据区域是:
ws.write(net::buffer(img.data,img.total() * img.elemSize()));
这里使用 total()
和 elemSize()
,指向文档的链接。
现在,如果接收端已经知道尺寸,这就足够了。如果没有,请先发送它们,例如:
uint32_t dimensions[] { htonl(image_witdh),htonl(image_height) };
std::vector<net::const_buffer> buffers {
net::buffer(dimensions),net::buffer(img.data,img.total() * img.elemSize())
};
ws.write(buffers);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。