从QImage创建QByteArray,反之亦然

时间:2014-08-20 16:24:50

标签: 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。

1 个答案:

答案 0 :(得分:4)

QImage::fromData不保留格式,它会尝试探测文件头。它也是一个静态函数,所以它不修改行(保持未初始化),它返回一个图像(你丢弃)。而且它的格式集中在PNGJPG之类的内容,而不是构造函数之类的像素格式。

所以要按现在的方式进行操作,你需要再次通过line.bits循环复制像素。

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