c++ - 从 QImage 创建 QByteArray,反之亦然

标签 c++ qt qimage qbytearray

我需要将已经创建的 QImage 编码到 QByteArray 中以发送到套接字,并在另一端对其进行解码。

在服务器端,我正在尝试执行以下操作:

// The vector is mandatory. The class that creates the image line expects it.

QVector<unsigned char> msg;  
QImage line(create_image_line(msg));

QByteArray ba((char*)line.bits(), line.numBytes());
for (int i = 0; i < ba.size(); ++i) {
  msg.append(ba[i]);
}

send_msg(msg);

create_image_line 的作用如下:

... handle the msg and get the image properties...
QImage img(pixels_, 1, QImage::Format_RGB32);
... set the values ...
return(img);

在客户端:

receive_msg(msg);
QByteArray ba;
for (int i = 0; i < msg.size(); ++i) {
  ba.append(msg[i]);
}

QImage line(LINE_WIDTH, 1, QImage::Format_RGB32);
line.fromData(ba);

出了问题,图像显示有很多噪音(我知道问题出在这个转换中,因为另一次成功的测试)。

我想知道问题出在哪里。

Rgds。

最佳答案

QImage::fromData 不保留格式,它尝试探测文件头。它也是一个静态函数,因此它不会修改行(保持未初始化状态),它返回一个图像(您将其丢弃)。它的格式集中是 PNGJPG 之类的东西,而不是像构造函数这样的像素格式。

因此,要按照现在的方式进行操作,您需要再次循环 line.bits 并复制像素。

但是,QDataStream可以序列化大多数 Qt 值类型,including QImage 。如果您控制两端并愿意更改协议(protocol),这可能是一个更简单、更强大的解决方案。

关于c++ - 从 QImage 创建 QByteArray,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25409845/

相关文章:

c++ - 使用三元条件运算符时不兼容的操作数类型

C++ - Pthread 如何发送值

python - 如何在QT中创建带有文本和颜色的简单图像(QImage)并将其另存为文件

c++ - 当用户更改 Windows 中的语言键盘布局时如何得到通知?

c++ - 使用模板学习 C++

c++ - 为 Qt 中 Items 交集定义的区域着色

c++ - 如何在Qt的不同窗口中连接两个对象?

c++ - 解密图像与原始图像不同

c++ - QImage文件路径

numpy - 在 Qt 中显示 matplotlib imshow 输出