【问题标题】:Create a QByteArray from a QImage and vice-versa从 QImage 创建 QByteArray ,反之亦然
【发布时间】:2014-10-14 02:43:37
【问题描述】:

我需要将已经创建的 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.

【问题讨论】:

    标签: c++ qt qimage qbytearray


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      相关资源
      最近更新 更多